Изменить набор символов MySQL по умолчанию на UTF-8 в my.cnf?
В настоящее время мы используем следующие команды в PHP, чтобы установить кодировку UTF-8 в нашем приложении.
Поскольку это немного накладные расходы, мы хотели бы установить это как настройку по умолчанию в MySQL. Можем ли мы сделать это в /etc/my.cnf или в другом месте?
SET NAMES 'utf8'
SET CHARACTER SET utf8
Я искал набор символов по умолчанию в /etc/my.cnf, но там нет ничего о наборах символов.
На этом этапе я сделал следующее, чтобы установить переменные набора символов и параметров сортировки MySQL в UTF-8:
skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8
Это правильный способ справиться с этим?
19 ответов
Чтобы установить значение по умолчанию UTF-8, вы хотите добавить следующее в my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
Если вы хотите изменить набор символов для существующей БД, дайте мне знать... ваш вопрос не указал это напрямую, поэтому я не уверен, что именно это вы и хотите сделать.
Для последней версии MySQL,
default-character-set = utf8
вызывает проблему. Это устарело, я думаю.
Как сказал Джастин Болл в " Обновлении до MySQL 5.5.12, и теперь MySQL не запускается, вы должны:
Удалите эту директиву, и вы должны быть хорошими.
Тогда ваш файл конфигурации (например, '/etc/my.cnf') должен выглядеть так:
[mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8
Перезапустите MySQL.
Чтобы убедиться, что ваш MySQL - UTF-8, выполните следующие запросы в командной строке MySQL:
Первый запрос:
mysql> show variables like 'char%';
Вывод должен выглядеть так:
+--------------------------+---------------------------------+ | 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 | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/| +--------------------------+---------------------------------+
Второй запрос:
mysql> show variables like 'collation%';
И результат запроса:
+----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+
На этот вопрос уже есть много ответов, но Матиас Биненс упомянул, что вместо utf8 следует использовать utf8mb4, чтобы иметь лучшую поддержку UTF-8 (utf8 не поддерживает 4-байтовые символы, поля усекаются при вставке). Я считаю это важным отличием. Итак, вот еще один ответ о том, как установить набор символов по умолчанию и сопоставление. Тот, который позволит вам вставить кучу poo ().
Это работает на MySQL 5.5.35.
Обратите внимание, что некоторые настройки могут быть необязательными. Поскольку я не совсем уверен, что ничего не забыл, я сделаю этот ответ в вики сообщества.
Старые настройки
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| 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)
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
конфиг
#
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4
Новые настройки
mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
символьная_система всегда utf8.
Это не повлияет на существующие таблицы, это просто настройка по умолчанию (используется для новых таблиц). Следующий код ALTER может использоваться для преобразования существующей таблицы (без обходного пути восстановления дампа):
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Редактировать:
На сервере MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection остаются в latin1. Выдача SET NAMES utf8
(utf8mb4 недоступен в этой версии) также устанавливает для utf8.
Предупреждение: если у вас была таблица utf8 со столбцом индекса типа VARCHAR(255), в некоторых случаях ее невозможно преобразовать, поскольку превышена максимальная длина ключа (Specified key was too long; max key length is 767 bytes.
). Если возможно, уменьшите размер столбца с 255 до 191 (потому что 191 * 4 = 764 < 767 < 192 * 4 = 768). После этого таблицу можно преобразовать.
На MySQL 5.5 у меня есть в my.cnf
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
Результат
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Примечание: файл my.cnf находится по адресу /etc/mysql/
После добавления этих строк:
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
Не забудьте перезапустить сервер:
sudo service mysql restart
MySQL v5.5.3 и выше:
Просто добавьте три строки только в разделе [mysqld]:
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake
Примечание: в том числе skip-character-set-client-handshake
здесь устраняется необходимость включать как init-connect
в [mysqld]
а также default-character-set
в [client]
а также [mysql]
разделы.
NijaCat была близка, но указана перебор:
Чтобы установить значение по умолчанию UTF-8, вы хотите добавить следующее в my.cnf
[client]
default-character-set=utf8
[mysqld]
default-character-set = utf8
Затем, чтобы проверить:
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Я также узнал, что после установки default-character-set = utf8
под [mysqld]
название, MySQL 5.5.x не будет запускаться под Ubuntu 12.04 (Precise Pangolin).
Все настройки, перечисленные здесь, являются правильными, но вот наиболее оптимальное и достаточное решение:
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
[client]
default-character-set = utf8
Добавьте это к /etc/mysql/my.cnf
,
Обратите внимание, я выбираю тип сортировки utf8_unicode_ci из-за проблем с производительностью.
Результат:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
И это когда вы подключаетесь как не-СУПЕР пользователь!
Например, разница между подключением как SUPER и пользователем без SUPER (конечно, в случае сортировки utf8_unicode_ci):
пользователь с SUPER прив.:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
пользователь с не SUPER прив.:
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
Я написал исчерпывающую статью, подробно объясняющую, почему вы должны использовать тот или иной вариант. Рассматриваются все типы наборов символов и сопоставлений: для сервера, для базы данных, для соединения, для таблицы и даже для столбца.
Надеюсь это и статья поможет прояснить неясные моменты.
Под Xubuntu 12.04 я просто добавил
[mysqld]
character_set_server = utf8
в /etc/mysql/my.cnf
И результат
mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Также взгляните на http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
На Fedora 21
$ vi /etc/my.cnf
Добавить подписку:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
Сохранить и выйти.
Последнее запомните, перезапустите службу mysqld с service mysqld restart
,
Директива была изменена на character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
Версии MySQL и дистрибутивы Linux могут иметь значение при настройке конфигурации.
Тем не менее, изменения под [mysqld]
раздел приветствуется.
Я хочу дать краткое объяснение ответа tomazzlender:
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
[ТуздЫ]
Это изменит collation_connection на utf8_unicode_ci
init_connect='SET collation_connection = utf8_unicode_ci'
С помощью SET NAMES
:
init_connect='SET NAMES utf8'
НАЗВАНИЯ SET влияют на три символа, то есть:
character_set_client
character_set_results
character_set_connection
Это установит character_set_database & character_set_server
character-set-server=utf8
Это повлияет только на collation_database & collation_server
collation-server=utf8_unicode_ci
Извините, я не совсем уверен, для чего это нужно. Я не использую это однако:
skip-character-set-client-handshake
Для utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server = utf8mb4_general_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
Согласно документации фреймворка symfony на https://symfony.com/doc/2.6/book/doctrine.html#configuring-the-database
Мы не рекомендуем использовать набор символов MySQL utf8, поскольку он не поддерживает 4-байтовые символы Юникода, и строки, содержащие их, будут усечены. Это исправлено новым набором символов utf8mb4.
Если у вас возникли проблемы с подтверждением поддержки набора символов клиента с помощью MySQL Workbench, имейте в виду следующее замечание:
Внимание! Все соединения, открываемые MySQL Workbench, автоматически устанавливают для клиентского набора символов utf8. Ручное изменение набора символов клиента, например использование SET NAMES ..., может привести к тому, что MySQL Workbench будет некорректно отображать символы. Для получения дополнительной информации о клиентских наборах символов см. Наборы символов соединения и сопоставления.
Таким образом, я не смог переопределить наборы символов MySQL Workbench с изменениями my.cnf. например, "установить имена utf8mb4"
MySQL 5.5, all you need is:
[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci
collation_server
не является обязательным.
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Если вас смущают ваши настройки для клиента и conn сбрасывается после перезапуска службы mysql. Попробуйте эти шаги (которые работали для меня):
vi /etc/my.cnf
- добавить содержимое удара и
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
- перезапустите mysql и войдите в систему mysql, используйте базу данных, введите команду
status;
вы найдете набор символов для 'client', а для 'conn' установлено значение 'utf8'.
Проверьте ссылку для получения дополнительной информации.
Вы можете сделать это так, как оно работает, и если это не сработает, вам нужно перезапустить mysql.
Изменить персонаж MySQL:
клиент
default-character-set=utf8
туздЫ
character_set_server=utf8
Мы не должны писать default-character-set=utf8
в mysqld, потому что это может привести к ошибке вроде:
начало: задание не удалось запустить
Наконец:
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+