MYSQL: через несколько часов строки в DDL of VIEW превратились в искаженные символы - PullRequest
0 голосов
/ 27 апреля 2020

Недавно я изменил DDL VIEW с помощью Workbench, добавив фильтр со строками китайских символов. DDL может быть успешно сохранен и отлично работал сразу после изменения. Однако сама модификация в DDL стала искаженными символами спустя несколько часов. База символов character_set_database и набор символов некоторых столбцов изначально были utf8 (utf8_general_ci). После получения ошибки я сделал все они utf8mb4 с сопоставлением по умолчанию (utf8mb4_0900_ai_ci). Искаженные символы изменились после изменения набора символов, но они все еще искажены. Есть идеи?

Пример: DDL сразу после модификации: где m. NAME не в ('王曉明', '張小英') DDL через несколько часов после модификации: где m. NAME не в ('??? D?', '?? \?')

Среда: MYSQL 8.0.13 Сервер совместной работы - GPL Windows 10 профессиональных 64-битных (традиционный китайский; набор символов ввода: UNICODE) Верстак 8.0.13

Показывать переменные типа '% char%' Результат: character_set_client utf8mb4 character_set_connection utf8mb4 набор символов_символов utf8mb4 символьный_системный бинарный файл character_set_results utf8mb4 character_set_server utf8mb4 character_set_system utf8 character_sets_dir C: \ Program Files \ MySQL \ MySQL Сервер 8.0 \ share \ charsets \

1 Ответ

0 голосов
/ 27 апреля 2020

Пожалуйста, предоставьте ссылку на Windows UNICODE - нам нужно определить, действительно ли это "кодовые точки Unicode" или "UTF-8". Если вы можете предоставить шестнадцатеричный дамп небольшого количества текста, я могу вывести ответ из этого.

В частности, 王曉明張小英, закодированный в UTF-8 (MySQL в utf8 или utf8mb4) имеет шестнадцатеричное значение

E78E8B E69B89 E6988E E5BCB5 E5B08F E88BB1

(пробелы добавляются к отдельным символам.) Для Unicode (UCS2 * MySQL):

738B 66C9 660E 5F35 5C0F 82F1

Итак, если вы получите второй гекс, то вы нужно объявить, что клиент использует ucs2, а не utf8mb4. Между тем вполне разумно, чтобы столбцы в ваших таблицах были utf8mb4. (И я рекомендую такой.)

«Набор символов» и «сопоставление»: utf8mb4 - «набор символов»; это определяет "кодирование", если байты. utf8mb4_0900_ai_ci - это «сопоставление»; он определяет порядок сортировки символов. У вас проблема с кодированием, а не проблема с сортировкой.

«через несколько часов после модификации» - это напоминает мне о производном компьютерного термина «ошибка». Большинство оригинальных компьютеров были построены из вакуумных трубок. Бабочки были привлечены к огням, исходящим для труб. Иногда они вызывали проблемы с оборудованием.

Hex A4FDBEE5A9FA - это кодировка Big5 для 王曉明.

...