Как заставить MySQL правильно обрабатывать UTF-8 - PullRequest
86 голосов
/ 14 октября 2008

Один из ответов на вопрос, который я задал вчера , предложил мне убедиться, что моя база данных может правильно обрабатывать символы UTF-8. Как я могу сделать это с MySQL?

Ответы [ 14 ]

76 голосов
/ 14 октября 2008

Обновление:

Краткий ответ - Вы почти всегда должны использовать кодировку utf8mb4 и сопоставление utf8mb4_unicode_ci.

Чтобы изменить базу данных:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

См .:

Оригинальный ответ:

MySQL 4.1 и выше имеет набор символов по умолчанию UTF-8. Вы можете проверить это в файле my.cnf, не забудьте установить и клиента и сервера (default-character-set и character-set-server).

Если у вас есть данные, которые вы хотите преобразовать в UTF-8, создайте дамп базы данных и импортируйте его обратно как UTF-8, убедившись, что:

  • используйте SET NAMES utf8 перед запросом / вставкой в ​​базу данных
  • использовать DEFAULT CHARSET=utf8 при создании новых таблиц
  • на этом этапе ваш клиент и сервер MySQL должны быть в UTF-8 (см. my.cnf). помните, что любые языки, которые вы используете (например, PHP), также должны быть UTF-8. Некоторые версии PHP будут использовать свою собственную клиентскую библиотеку MySQL, которая может не поддерживаться UTF-8.

Если вы хотите перенести существующие данные, не забудьте сначала сделать резервную копию! Когда все идет не так, как планировалось, может случиться много странного выбора данных!

Некоторые ресурсы:

38 голосов
/ 14 октября 2008

Чтобы сделать это 'постоянным', в my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

Для проверки перейдите к клиенту и покажите несколько переменных:

SHOW VARIABLES LIKE 'character_set%';

Убедитесь, что все они utf8, кроме ..._filesystem, которые должны быть binary и ..._dir, которые указывают где-то в установке MySQL.

30 голосов
/ 28 апреля 2015

MySQL 4.1 и выше имеет набор символов по умолчанию, который он вызывает utf8, но который на самом деле является только подмножеством UTF-8 (допускает только трехбайтовые символы и меньше).

Используйте utf8mb4 в качестве вашей кодировки, если вы хотите "полный" UTF-8.

19 голосов
/ 20 января 2016

Краткий ответ: используйте utf8mb4 в 4 местах:

  • Байт в вашем клиенте - utf8, а не latin1 / cp1251 / и т. Д.
  • SET NAMES utf8mb4 или что-то эквивалентное при установлении соединения клиента с MySQL
  • CHARACTER SET utf8mb4 для всех таблиц / столбцов - кроме столбцов, которые строго ascii / hex / country_code / zip_code / etc.
  • <meta charset charset=UTF-8> если вы выводите в HTML. (Да, здесь написание другое.)

Подробнее ;
UTF8 полностью

Приведенные выше ссылки предоставляют «подробный канонический ответ, необходимый для решения всех проблем». - На этом форуме ограничено пространство.

Редактировать

В дополнение к CHARACTER SET utf8mb4, содержащему «все» символы мира, COLLATION utf8mb4_unicode_520_ci является спорным «лучшим универсальным» сопоставлением для использования. (Существуют также турецкие, испанские и т. Д. Подборки для тех, кому нужны нюансы в этих языках.)

4 голосов
/ 14 октября 2008

Кодировка - это свойство базы данных (по умолчанию) и таблицы. Вы можете посмотреть (команды MySQL):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

Другими словами; довольно просто проверить кодировку базы данных или изменить ее:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
2 голосов
/ 25 января 2016

Чтобы изменить кодировку набора символов на UTF-8 для самой базы данных, введите следующую команду в приглашении mysql>. USE ALTER DATABASE .. Замените DBNAME на имя базы данных:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

Это дубликат этого вопроса Как преобразовать весь набор символов и сопоставление базы данных MySQL в UTF-8?

2 голосов
/ 20 мая 2012

Я последовал решению Хавьера, но добавил в my.cnf несколько разных строк:

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

Я нашел эту идею здесь: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html в первом / единственном пользовательском комментарии внизу страницы. Он упоминает, что skip-Character-Set-Client-Handshake имеет некоторое значение.

0 голосов
/ 14 апреля 2016

ПОДКЛЮЧЕНИЕ БАЗЫ ДАННЫХ к UTF-8

$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());
0 голосов
/ 25 января 2016

Установите database collation на UTF-8 затем примените table collation к базе данных по умолчанию.

0 голосов
/ 20 января 2016

Ваш ответ вы можете настроить через MySql Settings. В «Моем ответе» может быть что-то вне контекста, но это также знает, что это помощь для вас.
как настроить Character Set и Collation.

Для приложений, которые хранят данные, используя набор символов MySQL по умолчанию и сопоставление (latin1, latin1_swedish_ci), без специальной настройки должен быть нужен. Если приложения требуют хранения данных с использованием другой набор символов или сопоставление, вы можете настроить набор символов информация несколькими способами:

  • Укажите настройки символов для каждой базы данных. Например, приложения которые используют одну базу данных, может потребовать utf8, тогда как приложения, которые использование другой базы данных может потребовать sjis.
  • Укажите настройки символов при запуске сервера. Это вызывает сервер использовать данные настройки для всех приложений, которые не делают другие меры.
  • Укажите настройки персонажа во время конфигурации , если вы собираете MySQL из источника. Это заставляет сервер использовать данные настройки для всех приложения без указания их при запуске сервера.

Примеры, показанные здесь для вашего вопроса, чтобы установить набор символов utf8, здесь также установите параметры сортировки для более полезных (utf8_general_ci collation`).

Укажите настройки символов для базы данных

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

Укажите настройки символов при запуске сервера

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Укажите настройки символов во время настройки MySQL

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

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

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

Это может быть длинным ответом, но есть все пути, вы можете использовать. Надеюсь, мой ответ полезен для вас. для получения дополнительной информации http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

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