Сменить кодировку в 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 для базы данных содержащие таблицы
Вот ряд действий, которые вы должны предпринять если хотите сменить кодировку:
- Конечно же, делаем бэкап (мало ли что пойдет не так):
# 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_with_another_sets.sql
- Открываем файл для изменения кодировки:
# vim dump_with_another_sets.sql
- Вводим команды:
- :%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».