Наш предыдущий программист установил неправильную сортировку в таблице (Mysql). Он настроил это с помощью латинского сопоставления, когда это должно быть UTF8, и теперь у меня есть проблемы. Каждая запись с китайским и японским характером превращается в ??? персонаж.
Можно ли изменить сопоставление и вернуть детализацию персонажа?
Ответы:
изменить параметры сортировки базы данных:
изменить таблицу сортировки:
изменить параметры сортировки столбцов:
Что значат части
utf8mb4_0900_ai_ci
?Больше информации:
источник
CHARACTER SET utf8
умолчанию,utf8_general_ci
но вы также можете определить параметры сортировки, как этоALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
необходимоcreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
; если вы хотите изменить егоutf8_unicode_ci
, вы можете определить параметры сортировки:ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Это работает с таблицами точно так же, как с базами данных, как указал @KCD.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Вы должны сделать то же самое для двух других утверждений.Вот как изменить все базы данных / таблицы / столбцы. Запустите эти запросы, и они выведут все последующие запросы, необходимые для преобразования всей вашей схемы в utf8. Надеюсь это поможет!
- Изменить сопоставление базы данных по умолчанию
- Изменить таблицу сортировки / набор символов
- Изменить COLUMN Collation / Char Set
источник
Помните, что в Mysql
utf8
набор символов является лишь подмножеством действительного набора символов UTF8. Чтобы сохранить один байт памяти, команда Mysql решила хранить только три байта символов UTF8 вместо полных четырех байтов. Это означает, что некоторые восточноазиатские языки и эмодзи поддерживаются не полностью. Чтобы убедиться, что вы можете сохранить все символы UTF8, используйтеutf8mb4
тип данных и /utf8mb4_bin
илиutf8mb4_general_ci
Mysql.источник
utf8mb4_unicode_ci
вместоutf8mb4_general_ci
. См stackoverflow.com/questions/766809/... и drupal.stackexchange.com/questions/166405/...Добавляя к тому, что написал Дэвид Уиттакер, я создал запрос, который генерирует полный оператор таблицы и оператора alter для преобразования каждой таблицы. Это может быть хорошей идеей для запуска
SET SESSION group_concat_max_len = 100000;
Во-первых, убедитесь, что ваша группа concat не выходит за очень маленький предел, как показано здесь .
Разница между предыдущим ответом заключается в том, что он использовал utf8 вместо ut8mb4, а t1.data_type с t1.CHARACTER_MAXIMUM_LENGTH не работает для перечислений. Кроме того, мой запрос исключает представления, так как они должны быть изменены отдельно.
Я просто использовал сценарий Perl для возврата всех этих изменений в виде массива и перебрал их, исправил слишком длинные столбцы (обычно это были varchar (256), когда в данных было всего 20 символов, так что это было легко исправить). ).
Я обнаружил, что некоторые данные были повреждены при изменении из latin1 -> utf8mb4. Казалось, что кодированные в столбцах utf8 латинские символы 1 в столбцах дурачатся при преобразовании. Я просто держал данные из столбцов, которые, как я знал, будут проблемой в памяти до и после изменения, сравнивал их и генерировал операторы обновления для исправления данных.
источник
здесь хорошо описывается процесс. Тем не менее, некоторые символы, которые не помещались в латинице, исчезли навсегда. UTF-8 - СУПЕРСЕТЬ латыни1. Не наоборот. Большинство будет помещаться в однобайтовое пространство, но любые неопределенные не будут (проверьте список символов latin1 - не все 256 символов определены, в зависимости от определения latin1 в mysql)
источник