Промяна от latin1 на utf8 на mysql сървър

Наскоро започнахме да получаваме 'utf8' codec can't decode bytes in position 30-31: unexpected end of data, когато събираме данни от базата данни (използвайки Python и SQLAlchemy). Намерихме грешката в някои специални японски знаци.

Всички таблици имат CHARSET=utf8 и това са настройките, които имаме на сървъра, когато стартирам show variables;

| character_set_client                    | latin1
| character_set_connection                | latin1
| character_set_database                  | latin1
| character_set_filesystem                | binary
| character_set_results                   | latin1
| character_set_server                    | latin1
| character_set_system                    | utf8
| character_sets_dir                      | /usr/share/mysql/charsets/
| collation_connection                    | latin1_swedish_ci
| collation_database                      | latin1_swedish_ci
| collation_server                        | latin1_swedish_ci

Ако не искаме да преместим нашата среда към utf8 - Кои настройки се препоръчват и как трябва да експортираме и импортираме текущите данни, които имаме, за да работят с новите настройки?

Прочетох някои публикации за експортиране на данните като latin1 чрез добавяне на --default-character-set=latin1 към командата mysqldump и след това импортиране в базата данни, която има новите настройки, но тъй като оригиналните ни таблици вече са в utf8, това няма да работи.

Опитах да настроя връзката, след като прочетох тази тема: SQLAlchemy и UnicodeDecodeError

Това решава проблема със срива на приложението, но всички стари данни са повредени.


person Carl    schedule 02.12.2013    source източник
comment
Всъщност имате латински данни. Трябва да го извлечете, да го кодирате в UTF-8 и след това да импортирате отново в UTF-8 таблица за сортиране. Не мисля, че можете просто да промените кодирането за db и таблиците. Уверете се, че сте задали връзката и на UTF-8, в config или като използвате SET NAMES. правите резервно копие и опитвате просто да конвертирате?   -  person Daniel W.    schedule 02.12.2013
comment
Опитах да настроя връзката, това решава сриващото се приложение, но поврежда старите данни. Актуализирах въпроса.   -  person Carl    schedule 02.12.2013
comment
Така че, ако таблиците имат utf8 кодиране и връзката е latin1, действителните данни все още се съхраняват като latin1? @DanFromGermany   -  person Carl    schedule 02.12.2013
comment
Като цяло е лоша идея да се смесват кодировки. Това е като да сравнявате EXE и PDF файлове - не можете. Те имат различни байтове, различните символи имат различна дължина на байта, различен хедър (като BOM). Когато имате UTF-8 таблица и извличате данни с PHP чрез връзка latin1, тогава ще получите utf-8 данни в променлива latin1, данните ще бъдат повредени.   -  person Daniel W.    schedule 02.12.2013
comment
Може също да срещнете двойно кодиране. Най-добрият ресурс за вас в този случай е блогът за производителност, авторите са например основни разработчици на MariaDB, Percona, InnoDB: mysqlperformanceblog.com/2013/10/16/   -  person Daniel W.    schedule 02.12.2013


Отговори (1)


Можете да преобразувате сортирането на таблици с една заявка като:

ALTER TABLE <yourtable> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
person Eshant Sahu    schedule 20.03.2014