Казалось бы задача простая, выполни для каждой таблицы запрос:
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. кроме самих таблиц, нужно проверить кодировку текстовых полей, что-то вроде такого:
$result = mysql_query('SHOW TABLES');
while($tableName = mysql_fetch_array($result)){
$result_columns = mysql_query('SHOW FULL COLUMNS FROM `'.$tableName[0].'`');
while($info = mysql_fetch_array($result_columns)) {
if( $info['Collation'] === 'utf8' ){
...
}
}
это нужно, чтобы правильно разрулить конвертацию кодировок, например: utf8_bin, latin1, utf8, пример таблицы:
CREATE TABLE `new_table` ( `idnew_table` int(11) NOT NULL, `utf8bin` varchar(45) COLLATE utf8_bin DEFAULT NULL, `my_latin1` varchar(5) CHARACTER SET latin1 DEFAULT NULL, PRIMARY KEY (`idnew_table`), UNIQUE KEY `ema_UNIQUE` (`ema`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
особенно важно конвертирование utf8_bin поля в utf8, так например у меня запрос:
ALTER TABLE new_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
выдал:
Error Code: 1062. Duplicate entry 'my uniq case sensetive string' for key 'utf8bin_UNIQUE'
поясняю: поле utf8bin было уникальным, с учетом регистра символов, а мы его попытались привести к кодировке не поддерживающей cs (case sensetive - регистро-зависимость)
4. обратите внимание, что переходя с utf8_general_ci на utf8_unicode_ci мы расширяем таблицу символов, тут проблем нет, но расширяем мы ее все же не до utf8_bin, поэтому вопрос ci или cs остается открытым.
Комментарии
Комментариев пока нет.