Конвертируем базу данных в 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

youtube.com/watch?v=7hFivbgIEqk

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

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