PDA

Просмотр полной версии : Как конвертировать кодировку таблицы MySQL


Pavel Antonov
12.01.2008, 15:42
Можно обойтись без услуг "dumper".

Быстро конвертировать кодировку можно SQL запросом:
ALTER TABLE tt_content CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

void
12.01.2008, 18:49
Кстати, обидно, что результат SHOW TABLES нельзя использовать для конвертирования всех таблиц...

Valery Romanchev
21.07.2008, 00:53
напишу здесь, как конвертировать с dumper
Исходная ситуация - все таблицы с дефолтовым коллашном (который соответствует latin1).
Так бывает, когда не выставили в начале кодировку utf

Ситуации бывают и другие - так что за могут потребовать эксперименты.


Что делаем
0) делаем бэкап
1) ставим экст sfdbutf8 и меняем коллашн у всех таблиц и полей на utf8_general_ci
2) скачиваем dumper http://sypex.net/products/dumper/downloads/
и используем настройки


// Кодировка соединения с MySQL
// auto - автоматический выбор (устанавливается кодировка таблицы), cp1251 - windows-1251, и т.п.

//define('CHARSET', 'auto');
define('CHARSET', 'latin1');


// Кодировка соединения с MySQL при восстановлении
// На случай переноса со старых версий MySQL (до 4.1), у которых не указана кодировка таблиц в дампе
// При добавлении 'forced->', к примеру 'forced->cp1251', кодировка таблиц при восстановлении будет принудительно заменена на cp1251
// Можно также указывать сравнение нужное к примеру 'cp1251_ukrainian_ci' или 'forced->cp1251_ukrainian_ci'
//define('RESTORE_CHARSET', 'cp1251');
define('RESTORE_CHARSET', 'utf8');
и дампим, а потом закачивае базу

I am Phantom
10.11.2009, 04:41
Valery Romanchev, как-то у Вас сложно все! Вы же сами упомянули прекрасный инструмент дампер! Тут же коммент говорящий :)
// При добавлении 'forced->', к примеру 'forced->cp1251', кодировка таблиц при восстановлении будет принудительно заменена на cp1251

1. Бякап дампером (строка define('CHARSET', 'auto'); справляется прекрасно)
2. пишем строку define('RESTORE_CHARSET', 'forced->utf8');
3. прямо в этом же окне, где выполняли только что бякап, разворачиваем базу обратно

Вуаля! Улыбаемся и машем!:)

ukrsonic
29.12.2009, 04:30
Для особо ленивых кто любит phpMyAdmin

1. отмечаем все таблицы в вашей базе, выбираем действие "Анализ таблицы"
2. Из окошка SQL запросов, копируем список имен всех таблиц, каждое имя таблицы будет отделено так ( `имя_таблицы`, )
3. кидаем список в редактор и задаем поиск с заменой
вначале меняем ( `, ) на ( CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; )
затем заменяем просто ( ` ) на ( ALTER TABLE )
4. получаем вот такой готовый списочек SQL запросов
ALTER TABLE be_groups CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE be_sessions CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE be_users CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_extensions CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_hash CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_imagesizes CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_md5params CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_pages CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_pagesection CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_treelist CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cache_typo3temp_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cachingframework_cache_hash CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cachingframework_cache_hash_tags CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cachingframework_cache_pages CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cachingframework_cache_pagesection CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cachingframework_cache_pagesection_tags CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE cachingframework_cache_pages_tags CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE fe_groups CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE fe_sessions CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE fe_session_data CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE fe_users CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE pages CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE pages_language_overlay CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE static_template CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE static_tsconfig_help CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_be_shortcuts CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_domain CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_filemounts CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_language CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_lockedrecords CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_note CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_preview CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_refindex CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_refindex_rel CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_refindex_res CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_refindex_words CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_registry CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_template CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE sys_workspace CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tt_content CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tx_impexp_presets CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tx_rtehtmlarea_acronym CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
5. бросаем список в окно SQL запроса

УсЁ!

Manas
31.12.2009, 22:27
Есть еще экст. sfdbutf8 http://typo3.org/extensions/repository/view/sfdbutf8/current/ быстро и удобно.

андрюха
23.03.2010, 19:28
5. бросаем список в окно SQL запроса

УсЁ!
Гениально! Спасибо!

андрюха
23.03.2010, 19:38
Есть еще экст. sfdbutf8 http://typo3.org/extensions/repository/view/sfdbutf8/current/ быстро и удобно.
тоже хорошо! только теперь запутался по поводу разницы между utf8_general_ci и utf8_unicode_ci :confused:

Manas
24.03.2010, 01:03
utf8_unicode_ci поддерживает более широкое пространство символов, т.е. если вы используете немецкие умуляты или китайский язык - нужно использовать utf8_unicode_ci. Если только рус./англ. языки - достаточно utf8_general_ci т.к. работает быстрее.

Valery Romanchev
24.03.2010, 12:12
utf8_unicode_ci поддерживает более широкое пространство символов, т.е. если вы используете немецкие умуляты или китайский язык - нужно использовать utf8_unicode_ci. Если только рус./англ. языки - достаточно utf8_general_ci т.к. работает быстрее.

не совсем так, все символы поддерживаются и там и там, разница в работе сравнения:

The most significant feature in utf8_unicode_ci is that it supports expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages ‘ß’ is equal to ‘ss’.
utf8_general_ci is a legacy collation that does not support expansions. It can make only one-to-one comparisons between characters. This means that comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci.
так что если expansions не интересуют - то utf8_general_ci

андрюха
24.03.2010, 12:43
Спасибо, коллеги!

Nobody
30.03.2010, 17:41
Метод, приведённый в первом посте, не совсем верен. Правильный метод описан тут (по английски): http://bugs.typo3.org/view.php?id=6098#c15368

Конвертировать необходимо через binary, если хотите сохранить все поля правильно.

андрюха
31.03.2010, 14:34
А если без binary? Что должно случиться?
из кои-8 можно без binary?

Конвертировать необходимо через binary, если хотите сохранить все поля правильно.

jettero
08.04.2010, 11:37
Метод, приведённый в первом посте, не совсем верен. Правильный метод описан тут (по английски): http://bugs.typo3.org/view.php?id=6098#c15368

Конвертировать необходимо через binary, если хотите сохранить все поля правильно.
не вводите в заблуждение, про binary там говорится только для случая, когда надо конвертировать базу где UTF8 хранился в Latin1 базе

Nobody
08.04.2010, 13:31
А если без binary? Что должно случиться?
из кои-8 можно без binary?
У Вас конвертируется таблица, а вот collate и character set для полей останутся в старой кодировке. В результате получите это: http://lists.typo3.org/pipermail/typo3-russia/2010-April/001465.html

Nobody
08.04.2010, 13:32
не вводите в заблуждение, про binary там говорится только для случая, когда надо конвертировать базу где UTF8 хранился в Latin1 базе
Много раз конвертировать приходилось? :) Мне – много.

jettero
09.04.2010, 09:58
Много раз конвертировать приходилось? :) Мне – много.

Если вы много раз конвертировали через binary, то это еще не значит, что без binary конвертировать не верно, как вы утверждаете выше :)

И по вашей же ссылке и написано, когда необходим binary - в достаточно редких случаях: хранение UTF-8 данных в не UTF-8 таблице - такой изврат не часто встречается ;)

jettero
09.04.2010, 10:14
У Вас конвертируется таблица, а вот collate и character set для полей останутся в старой кодировке. В результате получите это: http://lists.typo3.org/pipermail/typo3-russia/2010-April/001465.html
только что проверил, поля прекрасно конвертируются вместе с таблицей :)
да можно было и не проверять, а прочитать мануал
If you want to change the table default character set and all character columns (CHAR, VARCHAR, TEXT) to a new character set, use a statement like this:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;