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

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

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

Ответ 1

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

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

Ответ 2

Для последней версии 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 |
       +----------------------+-----------------+
      

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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)

Ответ 7

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

Ответ 8

Примечание: Файл 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

Ответ 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

Ответ 10

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

[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 рассматриваются: для сервера, для базы данных, для подключения, для таблицы и даже для столбца.

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

Ответ 12

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

Ответ 13

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

Ответ 14

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)

Ответ 15

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

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

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

Ответ 16

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

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

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

Ответ 17

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

Ответ 18

Изменить символ 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/ |
 +--------------------------+----------------------------+