Конвертируем базу данных в MySQL

Казалось бы задача простая, выполни для каждой таблицы запрос:

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 остается открытым.

Источник: 1 - 2 - 3 - 4

Оцени публикацию:
  • 0,0
Оценили человек: 0

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

Новые заметки:

Про что мы забываем когда делаем оценку задачи по времени

Список вопросов для собеседования разработчика по телефону

Symfony2 авторизация без Doctrine2 для чайника

Phpstorm7 LiveEdit

Жесткий хабр или не хабр, тогда кто?

Яндекс.Деньги мошенничество

Как узнать какие страницы в поиске яндекса или это секрет

Последние комменты:

Yapro CMS:

Здравствуйте, Гость | Войти | Регистрация | Карта сайта | RSS ленты | Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » MySQL »