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

В настоящее время мы используем следующие команды в 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

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

Ответы [ 18 ]

408 голосов
/ 18 августа 2010

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

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

246 голосов
/ 03 июня 2012

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

default-character-set = utf8

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

Как говорит Джастин Болл в " Обновите MySQL до версии 5.5.12, и теперь MySQL не запускается , вы должны:

  1. Уберите эту директиву, и вы должны быть в порядке.

  2. Тогда ваш файл конфигурации (например, '/etc/my.cnf') должен выглядеть так:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    
  3. Перезапустите MySQL.

  4. Чтобы убедиться, что ваш 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 |
       +----------------------+-----------------+
      
55 голосов
/ 19 февраля 2012

На 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)
49 голосов
/ 30 июня 2014

На этот вопрос уже есть много ответов, но Матиас Биненс упомянул, что для обеспечения лучшей поддержки UTF-8 следует использовать utf8mb4 вместо utf8 (utf8 не поддерживает 4-байтовые символы, поля усечено при вставке ). Я считаю это важным отличием. Итак, вот еще один ответ о том, как установить набор символов по умолчанию и сопоставление. Тот, который позволит вам вставить кучу какашек (?).

Это работает на 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)

символ_системы всегда utf8 .

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

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.


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

26 голосов
/ 07 августа 2016

Примечание: Файл 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
24 голосов
/ 01 января 2012

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)
23 голосов
/ 22 февраля 2012

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

21 голосов
/ 23 января 2014

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] разделах.

9 голосов
/ 04 марта 2013

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

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

пользователь с non-SUPER priv.:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

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

Надеюсь это и статья поможет прояснить неясные моменты.

9 голосов
/ 22 апреля 2012

Под 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

...