Перенос данных между двумя MySQL с разными символами%, испорченными с utf8 - PullRequest
1 голос
/ 18 июля 2010

Перенос данных с MySQL server1 на MySQL server2

server1 Ver 14.12 Distrib 5.0.51a, для debian-linux-gnu (x86_64) с использованием readline 5.2

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+------------------------------------------+
| Variable_name            | Value                                    |
+--------------------------+------------------------------------------+
| character_set_client     | utf8                                     |
| character_set_connection | utf8                                     |
| character_set_database   | utf8                                     |
| character_set_filesystem | binary                                   |
| character_set_results    | utf8                                     |
| character_set_server     | latin1                                   |
| character_set_system     | utf8                                     |
| character_sets_dir       | /data/mysql/gabino/share/mysql/charsets/ |
+--------------------------+------------------------------------------+
8 rows in set

server2 Ver 14.12 Distrib5.0.90, для pc-linux-gnu (x86_64) с использованием readline 6.0

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set

Server1 MySQL является бэкэндом блога Wordpress, все отлично работает с внешнего интерфейса, пока я (неудачник) не получилчтобы перенести данные, поэтому я вошел в PhpMyAdmin и консоль MySQL.Теперь из бэкэнда кажется, что каждый восточноазиатский символ в server1 испорчен, либо в запросах SELECT в файлах консоли, либо в файлах mysqldump.Симптомом является, например, китайский символ , превращенный в три латинских символа 看, что является тем же результатом SELECT _latin1'看'.UTF8-представление - это \xe7\x9c\x8b, поэтому MySQL каким-то образом напрямую отображал каждый байт в виде отдельного символа latin1 вместо рендеринга 3 байтов в качестве китайского символа.

Даже если я использую функцию «Передача данных» в Navicat8, чтобы скопировать две базы данных с сервера1 на сервер2 одинаково, новый блог, работающий на сервере2, испортит символы.Я пробовал различные методы, такие как SET NAMES utf8 и т. Д., И до сих пор не могу этого сделать.

Так как мне сказать / заставить server1 MySQL обрабатывать символы latin1 как utf8 и отображать их и выводить правильно?

1 Ответ

1 голос
/ 18 июля 2010

Выполните шестнадцатеричный дамп (то есть: SELECT HEX(columnname) FROM table) на обоих серверах и посмотрите, совпадают ли данные.Если это так, то вы будете знать, что, по крайней мере, данные не были повреждены.

В этом случае вам просто нужно установить правильную кодировку и параметры сортировки для серверов.Если нет, вам, вероятно, придется заново выполнить передачу данных, и на этот раз убедитесь, что настройки верны.

Другое дело, убедитесь, что кодировка браузера установлена ​​в utf-8.

РЕДАКТИРОВАТЬ: Таким образом, данные действительно были повреждены при передаче.C3A7C593E280B9 является UTF-8 представлением 看.Вероятно, это связано с тем, что server1 отправляет данные в формате latin1, а server2 кодирует их в UTF-8.

Перед передачей данных необходимо изменить параметры подключения на сервере server1.Для этого выполните следующие запросы:

SET CHARACTER SET utf8; SET NAMES utf8

Затем повторите попытку передачи данных.

РЕДАКТИРОВАТЬ 2: Я думаю, что здесь происходит то, что вы сказали.Данные, хранящиеся в вашей базе данных, закодированы в UTF-8.Когда PHP (Wordpress) извлекает эти данные, он «думает», что они закодированы в латинице 1 (ISO-8859-1), что (к сожалению) используется PHP по умолчанию.PHP продолжает предоставлять эти данные в браузер пользователя, как если бы они были закодированы в латинице 1, но устанавливает кодировку символов как UTF-8, и пользователь видит то, что он должен видеть.

Короче говоря, этослучай двух ошибок делает право.Теперь у вас есть два варианта:

  1. Исправить данные.(т. е. считайте его как UTF-8 и запишите обратно как латиница 1)

  2. Установите для настроек соединения server2 то же самое, что и для server1, что приведет к тому, что данные все еще будут отображаться 1030 * правильно.

...