Здавалося б завдання просте, виконай для кожної таблиці запит:
ALTER TABLE '. $ TableName. 'CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
і справа зроблена! Однак, не все так просто і є такі моменти, на які варто звернути увагу:
В MySQL для кодувань існує 2 поняття CHARACTER і COLLATE і тут 2 моменти:
- для таблиці цілком - це різні значення (кодування зберігання даних в полях без вказівки кодування І кодування порівняння даних в полях таблиці)
- для поля таблиці - однакове значення (кодування зберігання даних)
1. CONVERT TO CHARACTER SET може зробити з даних - вопросики (якщо в новому кодуванні не підтримуються символи старої кодування). Тому, можливо не варто робити конвертацію, а досить змінити тип звірки даних:
ALTER TABLE '. $ TableName. 'COLLATE = utf8_unicode_ci;
2. конверт потрібно тільки ті таблиці, які вже не utf8, адже може бути кодування полів в цій таблиці вказана Спеціально не utf8 (наприклад щоб зменшити надмірність даних, адже utf8 під кожен символ використовує 2 байти, а не 1 як в інших кодуваннях)
3. крім самих таблиць, потрібно перевірити кодування текстових полів, щось на зразок такого:
це потрібно, щоб правильно розрулити конвертацію кодувань, наприклад: utf8_bin, latin1, utf8, приклад таблиці:
особливо важливо конвертування utf8_bin поля в utf8, так наприклад у мене запит:
пояснюю: поле utf8bin було унікальним, з урахуванням регістра символів, а ми його спробували привести до кодуванні що не підтримує cs (case sensetive - до регістру залежність)
4. зверніть увагу, що переходячи з utf8_general_ci на utf8_unicode_ci ми розширюємо таблицю символів, тут проблем немає, але розширюємо ми її все-таки не до utf8_bin, тому питання ci або cs залишається відкритим.