Встановіть значення символу_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?

Відповіді:


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 [Попередження] Використання унікальної опції префіксу character_set_client замість набору символів-клієнт-рукостискання застаріле і буде видалено у майбутньому випуску. Будь ласка, використовуйте замість повне ім’я. 2014-02-19 10:25:17 0 [Попередження] mysqld: ігнорування опції '--character-set-client-handhake' через недійсне значення 'utf8mb4'
qwaz

1
Чому skip-character-set-client-handshakeу вас конфігураційний файл? Це варіант командного рядка, а не змінна.
Mathias Bynens

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, розподіліть 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.