Сменить кодировку в Mysql/MariaDB в Unix/Linux

Сменить кодировку в Mysql/MariaDB в Unix/Linux

Столкнулся с проблемой, нужно было сменить кодировку (charset) для БД и ее таблиц. Решил записать заметку. В моей теме «Сменить кодировку в Mysql/MariaDB в Unix/Linux» я расскажу как можно изменить кодировку для таблиц/баз данных mysql или mariadb.

ПОМНИТЕ! Всегда создавайте бекапы, они вам помогут вернуть все данные, если пойдет что-то не так.

Установка стандартной кодировки для Mysql

Например, я сейчас, установлю кодировку utf8 для mysql, для этого открываем файл:

# vim /etc/my.cnf

и прописываем:

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8
default-collation=utf8_unicode_ci
character-set-server=utf8
collation-server=utf8_unicode_ci

Прописав стандартную кодировку utf для баз и таблиц в mysql, можно развернуть бекапы с помощью mysqldump с опцией «—skip-character-set parameter» — это развернет базу и она будет использовать новую кодировку utf8.

utf8_unicode и utf8_general не то же самое, но они очень похожи.

Преобразование кодировки для пустой базы данных

Чтобы преобразовать кодировку в пустой БД, выполните:

> ALTER DATABASE your_data_base_name charset=utf8;

Преобразование кодировки для базы данных с данными

Необходимо установить кодировку по умолчанию для баз данных. Это не преобразует существующие таблицы, это только установит значение по умолчанию для вновь создаваемых таблиц:

> ALTER DATABASE your_data_base_name CHARACTER SET utf8 COLLATE utf8_general_ci;

Преобразование кодировки для таблицы с данными

Необходимо установить кодировку по умолчанию для всех существующих таблиц и их столбцов. Это предполагает, что текущие данные на самом деле используют кодировку и чтобы изменить кодировку с одной на другую, выполните:

> ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Преобразование кодировки с помошью vi/vim для базы данных содержащие таблицы

Вот ряд действий, которые вы должны предпринять если хотите сменить кодировку:

  1. Конечно же, делаем бэкап (мало ли что пойдет не так):
    # mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
  2. Скопирую созданный бекап для дальнейшей правки:
    # cp dump.sql dump_with_another_sets.sql
  3. Открываем файл для изменения кодировки:
    # vim dump_with_another_sets.sql
  4. Вводим команды:
  • :%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
  • :%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
  • :wq

Можно выполнить команду и сменить кодировку для таблиц с командной строки:

# DB="zolushka_wpdbE91"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

Для удобства, у меня есть готовый скрипт для смены кодировки на UTF8, вы можете его скачать:

# cd /usr/local/src && wget http://linux-notes.org/wp-content/uploads/scripts/change_charsets_for_mysql.sh

Чтобы запустить, выполните:

# sh change_charsets_for_mysql.sh

Скрипт будет просить некоторую информацию, такую как логин и пароль от mysql. Если нужно будет использовать другую кодировку ( у меня прописана UTF8), то измените ее в данном скрипте, если не знаете как, напишите мне и я помогу.

Получил ошибку:

#1273 - Unknown collation: 'utf8mb4_unicode_ci'

Чтобы исправить данную ошибку, нужно открыть дамп БД и выполнить замену «utf8mb4_unicode_ci» на «utf8_general_ci»:

:%s/utf8mb4_unicode_ci/utf8_general_ci/g

Это решило данную проблему. Бывает так, что выдает подобную ошибку»Unknown character set: ‘utf8mb4′» и чтобы решить ее — нужно заменить строки:

:%s/utf8mb4/utf8/g

PS: Я использовал текстовый редактор — vi/vim.

На этом, я завершаю свою тему «Сменить кодировку в Mysql/MariaDB в Unix/Linux».

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.