Не удается сохранить символы UTF8 в MySQL - PullRequest
2 голосов
/ 16 сентября 2011

Не удается найти причину, по которой я не могу сохранить в базе данных MySQL такие символы, как ţ, î, ş.

Определение моей таблицы:

CREATE TABLE IF NOT EXISTS `gen_admin_words_translated` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `word_id` int(10) NOT NULL,
  `value` text COLLATE utf8_unicode_ci,
  `lang_id` int(2) NOT NULL,
  `needUpd` int(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2689 ;

Соединение с базой данныхэто делается с помощью следующего сценария:

$charset = "UTF8";
$link = mysql_connect($host, $user, $pass);
if(!$link){
    die("Unable to connect to database server.");
}
mysql_selectdb($database);
if(function_exists("mysql_set_charset")){
    mysql_set_charset($charset, $link);
}else{
    mysql_query("SET NAMES $charset");   
}

У меня есть в верхней части страницы:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

и сценарий:

$text = 'ţ, î, ş';
mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)");

ВсеЯ получаю в итоге в таблице:

SELECT * FROM  `gen_admin_words_translated` 

id   word_id value lang_id needUpd
5166 1034    ?,    1       1

Ответы [ 6 ]

4 голосов
/ 16 сентября 2011

когда я запускал твой скрипт, он работал для меня:

$charset = "UTF8";
$link = mysql_connect('localhost', 'root', '') or die('connection?');
mysql_select_db('test') or die('database?');
if(function_exists("mysql_set_charset")){
    mysql_set_charset($charset, $link);
}else{
    mysql_query("SET NAMES $charset");   
}

$text = 'ţ, î, ş';
mysql_query("insert into gen_admin_words_translated (word_id, lang_id, value, needUpd) values (1, 1, '$text', 1)");

$query = mysql_query('SELECT * FROM  `gen_admin_words_translated`');
$array = mysql_fetch_array($query);

print_r($array)

результат:

Array
(
    [0] => 2689
    [id] => 2689
    [1] => 1
    [word_id] => 1
    [2] => ţ, î, ş
    [value] => ţ, î, ş
    [3] => 1
    [lang_id] => 1
    [4] => 1
    [needUpd] => 1
)

что проверить:

проверьте, действительно ли ваша веб-страница имеет формат UTF-8, может быть, у вас есть какой-то набор, установленный в другом месте.

header('Content-type: text/html; charset=utf-8');

кодировка файла должна быть также в формате UTF-8, так как в противном случае она может сломать ваши символы.

3 голосов
/ 16 сентября 2011

Расширение моих комментариев в ответ:

Кажется, что вы все настроили правильно, и застряли только при вставке строкового литерала в базу данных. Чтобы сделать это успешно, вы также должны убедиться, что ваша кодировка текста для сохраненного PHP-сценария также UTF-8 .

Большинство достойных редакторов сообщат вам, с какой кодировкой вы работаете в данный момент, и также могут сохранять (то есть конвертировать между ними) различные кодировки (даже Блокнот делает это сегодня). Тем не менее, в качестве быстрой проверки вы можете добавить символ в ваш файл и сохранить его. Если размер файла изменяется на 1 или 2 байта вместо 3, вы не используете UTF-8 и вам необходимо преобразовать файл в эту кодировку.

Кроме этого, при получении текста в качестве ввода из браузера ваш код должен обрабатывать его очень хорошо.

Примечание: Хотя для установки кодировки для вашей страницы должно быть достаточно тега <meta>, лучше, если вы сделаете это с HTTP-заголовком из PHP, например:

header('Content-type: text/html; charset=utf-8');
2 голосов
/ 16 сентября 2011

Проверьте ваш файл инициализации MySQL.Он должен включать следующие строки набора символов:

[client]
port=3306

[mysql]
default-character-set=utf8
port = 3306
#
[mysqld]
basedir=".....
#Path to the database root
datadir=".....
# The default character set that will be used when a new schema or table is
# created and no character set is defined
character-set-server=utf8
2 голосов
/ 16 сентября 2011

Если это:

$text = 'ţ, î, ş';

- это ваш буквальный код, вам нужно убедиться, что исходный файл PHP * также закодирован как UTF-8 . В противном случае эти символы будут символами ISO-8859-1 в контексте Unicode, что приведет к появлению неработающих символов.

2 голосов
/ 16 сентября 2011

Последний результат, который вы вставили, получен из командной строки MySQL? Если это так, попробуйте SET NAMES utf8; перед запросом SELECT * FROM gen_admin_words_translated

1 голос
/ 16 сентября 2011

В этом выражении вы вставляете символы в том виде, в каком они существуют в текущем файле PHP:

$text = 'ţ, î, ş';

Однако они будут закодированы с использованием кодировки символов вашего PHP-файла. Если этот PHP-файл не использует сам кодировку UTF-8, результирующая строка не будет кодироваться в кодировке UTF-8.

Вам следует использовать ваш текстовый редактор, чтобы проверить кодировку символов, используемую в текущем файле. Все достойные текстовые редакторы должны иметь возможность отображать, а некоторые могут преобразовывать кодировку символов, используемую в документе.

Чтобы создать более переносимый код, гарантируя, что кодировка символов вашего документа не имеет значения, вы можете использовать закодированные значения, например:

$text = "\xC5\xA3, \xC3\xAE, \xC5\x9F";

К сожалению, если вам придется много чего делать, это будет больно, потому что вы должны использовать многобайтовое шестнадцатеричное представление - PHP не имеет встроенного способа Unicode для задания символов, как некоторые другие языки ( куда вы можете перейти "\ u163" вместо "\ xC5 \ xA3").

Вы можете посмотреть представление UTF-8 в шестнадцатеричном формате, используя инструменты, подобные этому .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...