Кодирование базы данных и сервера - PullRequest
0 голосов
/ 22 февраля 2012

Я импортирую данные извне в свою базу данных MYSQL с помощью PHP-скриптов.Кодируя кодировку моей базы данных в utf8 из запроса

ALTER DATABASE DEFAULT CHARSET 'utf8';

, затем я выполнил запрос, чтобы просмотреть все кодировки по

SHOW VARIABLES LIKE 'character_set%';

:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

какмы можем видеть, что character_set_database установлен на utf8, но все же, если я напишу код из моего PHP-скрипта, чтобы увидеть кодировку как

echo $charset = mysql_client_encoding($cn);

, вывод будет latin1.Из приведенного выше запроса latin1 только для сервера.Может кто-нибудь сказать мне, что именно мне не хватает, так как я не могу кодировать символы китайского и японского в базу данных.

РЕДАКТИРОВАТЬ

Я импортирую базу данных извне, котораяиметь символы Юникода, такие как 我 的 上网 主页 и 嶏 紞 鎴 戠 Chinese на китайском, японском и других языках.Но когда я импортирую данные в таблицы базы данных, я получаю ?????вместо вышеперечисленных персонажей.Как я могу кодировать эти символы?Это utf-8 или 16 и как я могу узнать, какая кодировка будет поддерживать эти символы?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

character_set_database просто ссылается на набор символов по умолчанию любых созданных таблиц в этой БД, Я думаю .Поэтому, установив его в UTF8, не поможет, я предлагаю следующее:

Каждый раз, когда я инициализирую соединение с базой данных, я выполняю $db->query("SET NAMES 'utf8'");

Разговоры о SET NAMES https://stackoverflow.com/a/1650834/1221902

Подробнее об именах наборов для критиков

Доступность соответствующей функции, которая будет лучшей альтернативой * 1016, будет зависеть от вашей версии MySQL / PHP.* query.

Оператор SET NAMES 'x' эквивалентен этим трем операторам:

SET character_set_client = x;SET character_set_results = x;SET character_set_connection = x;

С http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html MySQL 5.1 (многие все еще используют 5.1)

character_set_resultsСистемная переменная указывает набор символов, в котором сервер возвращает результаты запроса клиенту.Это включает в себя данные результатов, такие как значения столбцов, и метаданные результатов, такие как имена столбцов.

0 голосов
/ 22 февраля 2012

Вам не хватает кодировки client .
Хотя приведенные выше переменные относятся только к серверной части, вы должны настроить кодировку клиента, используя

mysql_set_charset()

.вы используете устаревшую версию PHP, единственная опция, которая у вас есть (кроме обновления PHP / переключения драйверов) - это SET NAMES <actual data encoding> запрос набора имен.

Как оказалось, ваша проблема не в настройке кодировки соединения, а в некотором загадочном«импорт».Поскольку вы не предоставляете подробностей, я могу только догадываться.
Если вы импортируете какой-то mysql dump - проверьте определения таблиц.вполне вероятно, что кодировка там может быть неправильной.Вы можете просто изменить его с помощью поиска и замены.

...