Как заставить MySQL правильно обрабатывать UTF-8

В одном из ответов на a question I asked yesterday предлагалось убедиться, что 9X_mysql-server моя база данных может правильно обрабатывать 9X_mysqldump символы UTF-8. Как я могу это сделать с 9X_utf8-decode MySQL?

117
3

  • Этот вопрос полностью совпадает с этим ... Посмотрите, пожалуйста, на этот ...
7
Общее количество ответов: 7

Ответ #1

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

Обновление:

Краткий ответ. Практически всегда следует 9X_mysqld использовать кодировку utf8mb4 и параметры сортировки 9X_mysqldump utf8mb4_unicode_ci.

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

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

См .:

Исходный ответ:

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

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

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

Если вы действительно 9X_mysql-server хотите перенести существующие данные, не 9X_mysqlclient забудьте сначала сделать резервную копию! Когда 9X_mysql-table что-то пойдет не так, как планировалось, может 9X_my-sql произойти много странного измельчения данных!

Некоторые 9X_my-sql ресурсы:

  • complete UTF-8 migration (cdbaby.com)
  • статья на UTF-8 readiness of php functions (обратите внимание, что часть этой информации устарела)

108
6

  • В MySQL никогда не было набора символов по умолчанию UTF-8. 4.1 и 5.x до последней версии 5.7 используют latin1 и latin1_swedish_ci для кодировки по умолчанию и сопоставления. См. Страницу «Набор симво ...

Ответ #2

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

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

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

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

SHOW VARIABLES LIKE 'character_set%'; 

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

47
1

  • Это не так. То, что MySQL называет `utf8`, не является" полн ...

Ответ #3

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

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

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

33
2

  • В стороне, я хотел бы сделать паузу и пристально взглянуть на команду MySQL. о_о Вы что, ребята думали? Вы понимаете, сколько путаницы вы посеяли, создав в своей программе кодовую страницу под названием «utf8», которая на самом деле не являет ...

Ответ #4

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

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

  • В вашем клиенте используются байты utf8, а не latin1 / cp1251 / и т. д.
  • SET NAMES utf8mb4 или что-то подобное при установлении соединения клиента с MySQL
  • CHARACTER SET utf8mb4 для всех таблиц / столбцов, кроме столбцов, которые имеют строго ascii / hex / country_code / zip_code / и т. д.
  • , если вы выводите в HTML. (Да, здесь другое написание.)

More info;
UTF8 all the way

Приведенные 9X_mysqlsh выше ссылки предоставляют "подробный 9X_mysqlsh канонический ответ, необходимый для решения 9X_mysqldump всех проблем". - На этом форуме ограничено 9X_mysql-query пространство.

Изменить

Помимо CHARACTER SET utf8mb4, содержащего «все» символы 9X_mysql-if мира, можно утверждать, что COLLATION utf8mb4_unicode_520_ci является «лучшим 9X_mysqlclient универсальным» сопоставлением для использования. (Есть 9X_mysqlclient также сопоставления на турецком, испанском 9X_mysql-if и т. Д. Для тех, кому нужны нюансы на этих 9X_mysql-server языках.)

21
0

Ответ #5

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

Кодировка - это свойство базы данных (по 9X_mysqlsh умолчанию) и таблицы. Вы можете посмотреть 9X_utf-8 (команды 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 

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

ALTER TABLE `foo`.`bar` CHARACTER SET utf8; 

5
1

  • Это не так. То, что MySQL называет `utf8`, не являе ...

Ответ #6

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

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

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

Я нашел 9X_mysql-if эту идею здесь: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html в первом / единственном 9X_mysql-query комментарии пользователя внизу страницы. Он 9X_utf8-decode упоминает, что skip-character-set-client-handshake имеет некоторое значение.

3
1

  • Этот нелюбимый ответ без голосования был единственным, что мне ...

Ответ #7

Ответ на вопрос: Как заставить MySQL правильно обрабатывать UTF-8

Чтобы изменить кодировку набора символов 9X_mysql-query на UTF-8 для самой базы данных, введите 9X_mysql-table следующую команду в командной строке mysql>. ИСПОЛЬЗУЙТЕ 9X_utf-8 ALTER DATABASE .. Замените DBNAME именем базы данных:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci; 

Это 9X_mysqlsh дубликат этого вопроса How to convert an entire MySQL database characterset and collation to UTF-8?

3
0