Как преобразовать весь набор символов и сопоставление базы данных MySQL в UTF-8? - PullRequest
426 голосов
/ 24 мая 2011

Как я могу преобразовать весь набор символов базы данных MySQL в UTF-8 и сопоставление в UTF-8?

Ответы [ 17 ]

3 голосов
/ 10 января 2016
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
2 голосов
/ 06 июня 2018

Самый безопасный способ - сначала изменить столбцы на двоичный тип, а затем преобразовать его обратно в тип с использованием требуемой кодировки.

Каждый тип столбца имеет свой соответствующий двоичный тип, как показано ниже:

  1. CHAR => BINARY
  2. ТЕКСТ => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

Например:.

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Я пробовал в нескольких латинских таблицах, и в нем сохранялись все диакритические знаки.

Вы можете извлечь этот запрос для всех столбцов, которые делают это:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

После того, как вы сделаете это для всех ваших столбцов, вы сделаете это для всех таблиц:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Чтобы сгенерировать этот запрос для всей вашей таблицы, используйте следующий запрос:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

И теперь, когда вы изменили все свои столбцы и таблицы, сделайте то же самое с базой данных:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
1 голос
/ 20 ноября 2013

Если вы не можете преобразовать свои таблицы или если для вашей таблицы всегда задан какой-то набор символов, отличный от utf8, но вы хотите использовать utf8, лучшим вариантом будет стереть его и начать заново и явно указать:

create database database_name character set utf8;
0 голосов
/ 28 июня 2016

Вы также можете использовать инструмент БД Navicat, который делает это проще.

  • Шив.

Щелкните правой кнопкой мыши по вашей базе данных и выберите Свойства базы данных и измените ее в раскрывающемся списке

enter image description here

0 голосов
/ 25 января 2016

Чтобы изменить кодировку набора символов на UTF-8 для самой базы данных, введите следующую команду в приглашении mysql>. Замените DBNAME на имя базы данных:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
0 голосов
/ 16 марта 2015

alter table table_name charset = 'utf8';

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

0 голосов
/ 09 июля 2014

Единственное решение, которое сработало для меня: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Преобразование базы данных, содержащей таблицы

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
...