Изменить набор символов MySQL по умолчанию на UTF-8 в my.cnf?

286

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

Так как это немного накладные расходы, мы хотели бы установить это как значение по умолчанию в MySQL. Можем ли мы сделать это в /etc/my.cnf или в другом месте?

SET NAMES 'utf8'
SET CHARACTER SET utf8

Я искал кодировку по умолчанию в файле /etc/my.cnf, но там ничего нет о кодировках.

В этот момент я сделал следующее, чтобы установить переменные charset и переменные сортировки MySQL в UTF-8:

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

Это правильный способ справиться с этим?

  • 18
    Обратите внимание, что лучшим значением по умолчанию будет utf8mb4 , то есть реальный UTF-8 с полной поддержкой Unicode. См. Как поддерживать полный Unicode в базах данных MySQL .
  • 0
    @Jorre, не возражаете ли вы изменить это на utf8mb4 это своего рода опасный прецедент?
Теги:
character-encoding

18 ответов

367

Чтобы установить значение по умолчанию для 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

Если вы хотите изменить набор символов для существующей БД, дайте мне знать... ваш вопрос не указал его напрямую, поэтому я не уверен, что это то, что вы хотите сделать.

  • 0
    спасибо, я решил это таким образом, вы можете сообщить мне, если это также правильный способ справиться с этим? Пропустить набор символов-клиент-рукопожатие character_set_client = utf8 character_set_server = utf8
  • 16
    Вышеуказанные настройки my.cnf также работали для меня. Кроме того, я должен был убедиться, что таблица была установлена правильно, например, ALTER TABLE Table CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Показать ещё 11 комментариев
222

Для последней версии MySQL

default-character-set = utf8

вызывает проблему. Думаю, это не рекомендуется.

Как Justin Ball говорит в " Обновляется до 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 |
       +----------------------+-----------------+
      
  • 0
    Ваша первая строка max_allowed_packet = 64M связана с этой проблемой UTF8 каким-либо образом?
  • 0
    Это был ответ для меня - спасибо!
Показать ещё 8 комментариев
54

В 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)
  • 2
    Что именно делает skip-character-set-client-handshake и при каких обстоятельствах это требуется?
  • 3
    @Simon, при использовании show variables like "%collation%"; Я видел «collation_connection» как utf8_general_ci а collation_database и collation_server как utf8_unicode_ci . Добавление строки skip-character-set-client-handshake изменило общую запись на юникод, поэтому все три были согласованы.
Показать ещё 5 комментариев
33

У этого вопроса уже много ответов, но Матиас Биненс упомянул, что вместо 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)

Config

#  ?
# 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)

character_set_system всегда utf8.

Это не повлияет на существующие таблицы, это просто настройка по умолчанию (используется для новых таблиц). Следующий код ALTER можно использовать для преобразования существующей таблицы (без обходного пути dump-restore):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Edit:

На сервере MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection остаются на latin1. Выдача SET NAMES utf8 (utf8mb4, недоступная в этой версии) также устанавливает их в utf8.


Caveat: Если у вас была таблица utf8 с индексным столбцом типа VARCHAR (255), она не может быть преобразована в некоторых случаях, поскольку максимальная длина ключа превышена (Specified key was too long; max key length is 767 bytes.). Если возможно, уменьшите размер столбца от 255 до 191 (потому что 191 * 4 = 764 < 767 < 192 * 4 = 768). После этого таблица может быть преобразована.

  • 0
    Я следовал вашим настройкам, но я считаю, что character_set_database все еще utf8 а collation_database is utf8_bin`. Я что-то пропустил?
  • 0
    Нашел то, что я пропустил. Эти 2 параметра устанавливаются при создании самой базы данных. Смотрите этот вопрос; stackoverflow.com/questions/22572558/...
Показать ещё 2 комментария
23

Я также выяснил, что после установки default-character-set = utf8 под заголовком [mysqld] MySQL 5.5.x не запускался под Ubuntu 12.04 (Точный панголин).

  • 16
    Это ошибка MySQL # 52047 . В [mysqld] вы должны использовать character-set-server вместо default-character-set по default-character-set . (Очень запутанно, я согласен!)
  • 0
    Да. Устаревший в 5.0; снято в 5.5.
22

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)
  • 5
    Хороший ответ. Возможно, краткое объяснение того, какие части излишни, поможет людям точно решить, чего они хотят в своей конфигурации.
  • 0
    большое спасибо за это !!! У меня были проблемы в течение очень долгого времени ...
Показать ещё 4 комментария
18

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].

  • 1
    Ух ты, так много повторяющихся ответов на этот вопрос, и все же он кажется самым простым. У меня тоже работает на v5.5.44.
13

Примечание: Файл 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
  • 2
    Примечание: это меняет настройки по умолчанию; это не меняет кодировку для любых существующих столбцов.
9

Все приведенные здесь параметры верны, но вот наиболее оптимальное и достаточное решение:

[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 и не 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 |
+----------------------+-----------------+

Я написал всеобъемлющую статью (rus), в которой подробно объясняется, почему вы должны использовать тот или иной вариант. Все типы наборов символов и Collations рассматриваются: для сервера, для базы данных, для подключения, для таблицы и даже для столбца.

Я надеюсь, что это и статья помогут прояснить неясные моменты.

  • 3
    Я хотел бы прочитать вашу связанную статью, но не могу читать по-русски, и Google Translate не слишком полезен для технических текстов. Из того, что я могу сказать, хотя это было бы очень интересно. Не могли бы вы рассмотреть возможность размещения английской версии?
  • 2
    Не могли бы вы объяснить, какой параметр не устанавливает параметры сортировки пользовательских соединений SUPER? (и есть ли решение)
Показать ещё 2 комментария
9

В 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

  • 0
    Вам также потребуется [client] default-character-set = utf8, иначе, когда вы используете mysql в командной строке, он не будет использовать utf8, потенциально разрушая любые резервные копии, которые вы передаете в файл.
5

Директива изменилась на character-set-system=utf8

http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html

4

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

[mysqld]

Это изменит значение 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
  • 0
    В документации отмечается, что character_set_server не следует устанавливать вручную.
  • 0
    Так что же такое современный подход? Мы можем явно передать character set при установлении соединения с базой данных, однако выглядит немного раздражающим.
Показать ещё 2 комментария
3

В 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.

1

Если вы запутались в настройках для клиента, а соединение сбрасывается после перезапуска службы mysql. Попробуйте эти шаги (которые работали для меня):

  • vi /etc/my.cnf
  • добавьте удар по содержимому и :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  • перезапустите mysql и войдите в систему mysql, используйте базу данных, команду ввода status;, вы увидите, что набор символов для "client" и "conn" установлен на "utf8".

Подробнее о ссылка.

1

Если у вас возникли проблемы с подтверждением поддержки набора символов с помощью MySQL Workbench, обратите внимание на следующее примечание:

Внимание! Все подключения, открытые MySQL Workbench, автоматически устанавливают символ клиента установлен в utf8. Ручное изменение набора символов клиента, например, использование SET NAMES ..., может заставить MySQL Workbench неправильно отображать символы. Для дополнительную информацию о наборах символов клиента см. в разделе "Наборы символов соединения" и Collations.

Таким образом, мне не удалось переопределить наборы символов MySQL Workbench с изменениями my.cnf. например 'set names utf8mb4'

1

MySQL 5.5, все, что вам нужно:

[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)
0

Вы можете сделать это так, как он есть, и если он не работает, вам нужно перезапустить mysql.

-2

Изменить символ MySQL:

Client

default-character-set=utf8

туздЫ

character_set_server=utf8

Мы не должны писать default-character-set=utf8 в mysqld, потому что это может привести к ошибке, например:

start: Не удалось запустить задание

Наконец:

 +--------------------------+----------------------------+
 | 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/ |
 +--------------------------+----------------------------+

Ещё вопросы

Сообщество Overcoder
Наверх
Меню