Установите значение свойства character_set_client в utf8mb4

12

Я пытаюсь преобразовать свою БД в utf8mb4следование этому руководству . Я установил:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake

Но значение character_set_clientи character_set_resultsвсе равно не изменится до utf8mb4.

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

Что я делаю неправильно? Как мне получить эти значения в utf8mb4?

qwaz
источник

Ответы:

14

Раскрытие информации: я являюсь автором статьи Как поддерживать полный Unicode в базах данных MySQL , руководство, которому вы следуете.

  1. Где вы сохранили измененные настройки? Проверьте, откуда mysqldзагружаются параметры по умолчанию. Обычно это /etc/my.cnf( как указано в руководстве ), но может отличаться в вашей системе. Выполните следующую команду, чтобы узнать:

    $ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
  2. Вы перезапустили mysqld, запустив mysqld restartпосле внесения изменений?

Матиас Биненс
источник
1. Я сохранил изменения в \xampp\mysql\bin\my.ini. Мне не удалось запустить mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- так как это выдает следующую ошибку: 'grep' is not recognized as an internal or external command, operable program or batch file.я новичок в этом, поэтому я могу что-то делать не так.
qwaz
2. Я перезапустил mysqld, и после этого я получил следующие предупреждения: 2014-02-19 10:25:17 0 [Предупреждение] Использование уникального префикса option character_set_client вместо символьного набора client-handshake устарело и будет удалено в будущем выпуске. Пожалуйста, используйте полное имя вместо. 2014-02-19 10:25:17 0 [Предупреждение] mysqld: игнорирование опции '--character-set-client-handshake' из-за недопустимого значения 'utf8mb4'
qwaz
1
Почему у вас skip-character-set-client-handshakeв вашем конфигурационном файле? Это опция командной строки, а не переменная.
Матиас Биненс
1
Мне пришлось переустановить локальный сервер; снова прошелся по вашему гиду, и все получилось. Я ценю ваш ответ и помощь. Я вернусь к вашему ответу и опрошу его, как только у меня будет достаточно повторений для этого.
qwaz
3
Я попытался это , но до сих пор character_set_client, character_set_connection, character_set_results, collation_connectionпоказано как utf8. Есть идеи, почему это не работает?
Сарита
2

Я также следовал этому руководству, однако та же проблема появилась снова. Фактическая проблема заключается в команде, используемой для создания БД в DEFAULT CHARACTERкачестве аргумента, и если она не передается во время выполнения, передается набор символов по умолчанию, а это не так utfmb4.

Ниже приведены шаги, которые я выполнил, чтобы исправить это:

  1. Создайте фиктивную базу данных с utf8mb4набором символов.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. Скопировать фактическую структуру и данные в эту фиктивную базу данных из фактической базы данных

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. Удалить текущую базу данных

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. Создать новую базу данных

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. Наконец, поместите структуру таблицы и данные обратно в исходную базу данных.

    mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name

Если вы собираетесь использовать вышеупомянутую процедуру, пожалуйста, внимательно прочитайте также нижеприведенные строки.

Предпосылки и мой статус-кво:

  • Резервное копирование всей вашей структуры, данных, хранимых процедур, функций, триггеров и т. Д.
  • mysql --version mysql Ver 14.14 Distrib 5.7.22, для Linux (x86_64) с использованием оболочки EditLine

  • cat /etc/my.cnf

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    init-connect = 'SET NAMES utf8mb4
    collation-server = utf8mb4_unicode_ci
  • Я использую Java-клиент, который 'mysql:mysql-connector-java:5.1.30'

  • Моя строка подключения jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Оби Ван - Паллавья
источник