Изменение набора символов в MySQL

Когда я запустил свой веб-сайт, я установил для всех столбцов таблицы значение «utf8_general_ci», думая, что это заставит все храниться в UTF8.

Согласно функции mysql_client_encoding() в PHP, я все время использовал latin1 для своего соединения.

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

На StackOverflow есть куча ответов, но многие из них я нахожу расплывчатыми. Еще пара полезных:

Запросите все данные и обновите их как UTF8 https://stackoverflow.com/a/2335254/158126

Используйте скрипт, созданный для преобразования таблиц https://stackoverflow.com/a/13400547/158126

По вашему опыту, что вы сделали, чтобы решить эту проблему и сохранить все пользовательские данные в таблицах MySQL?


person Ben Sinclair    schedule 30.04.2013    source источник


Ответы (1)


В вашей ситуации я бы предложил попробовать выполнить для каждого плохого столбца (подключенного через соединение utf8):

// create a new column to store the latin1
alter table <table> add <column-latin1> <length> character set latin1;

// copy the utf8 data into the latin1 column without charset conversion
update <table> set <column-latin1> = binary <column-utf8>;

// verify the latin1 data looks OK
select <column-latin1> from <table>;

// copy the latin1 column into the utf8 column WITH charset conversion
update <table> set <column-utf8> = <column-latin1>;

// verify the new, properly encoded UTF8 data looks OK
select <column-latin1> from <table>;

// remove the temporary columns
alter <table> drop <column-latin1>;

И настройте своих клиентов на использование соединения UTF8.

person svidgen    schedule 30.04.2013
comment
Спасибо @svidgen. Если я настрою свой клиент на использование соединения UTF8, нужно ли мне обновлять настройки базы данных MySQL до UTF8? Например: набор символов по умолчанию = utf8? Или mysql_set_charset() в моем коде будет всем, что мне нужно для работы в будущем? А в вашем втором примере это будет BINARY (column-utf8) в запросе MySQL? Я никогда раньше не использовал функцию BINARY. - person Ben Sinclair; 30.04.2013
comment
Server characterset и default* настройки на сервере, базе данных и таблицах определяют кодировку для полей без кодировки, явно назначенной во время создания. Ключевое слово BINARY указывает MySQL обрабатывать данные, как если бы они не были текстом. Таким образом, первый update выше скопирует содержимое column-utf8 в column-latin1 байт за байтом. Второй update копирует наоборот посредством преобразования кодировки, потому что MySQL интерпретирует его как текст. - person svidgen; 30.04.2013