UTF-8 поврежден из MySQL в SQLite - PullRequest
       4

UTF-8 поврежден из MySQL в SQLite

0 голосов
/ 28 сентября 2010

Я портирую веб-приложение PHP, написанное с MySQL 5, на SQLite 3. Кодировкой текста для обоих является UTF-8 (для всех полей, таблиц и баз данных).У меня возникают проблемы при переносе базы геоданных со специальными символами.

mb_detect_encoding() обнаруживает, что оба возвращают данные UTF-8.

Например,

Rawвывод:

MySQL (правильный): Дарб, Иран
SQLite (неправильный): DÄrÄb, Иран

Кодировка JSON:

MySQL (правильный): D \ u0101r \ u0101b, Иран
SQLite (неправильный): D \ u00c4 \ u0081r \ u00c4 \ u0081b, Иран

Что решает проблему:

$sqlite_output = utf8_encode($sqlite_output);
$sqlite_output = utf8_decode($sqlite_output);

Я предполагаю, что есть способ восстановить базу данных SQLite.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2010

Ну, спасибо за советы и комментарии. К сожалению, независимо от того, какие конфигурации я выбрал, это не займет. В итоге я просто инициировал два объекта PDO и, используя цикл while, вставлял по одной строке за раз. (Я использовал mysqldump 's --no-data, чтобы получить структуру и изменил ее вручную.)

Потребовалось около 10 минут, чтобы вставить ~ 10000 строк, равных 9,4 МБ данных, в мой блок CentOS объемом 256 МБ. (Поэтому, если вы находитесь в общей среде, будьте осторожны с максимальным временем выполнения.) База данных SQLite теперь возвращает правильные данные Unicode.

Примечание для себя: проще обойти код, чем найти рекомендуемое решение.

0 голосов
/ 03 октября 2010

Стандартный дистрибутив PHP собирает libsqlite в режиме кодирования ISO-8859-1.Тем не менее, это неправильно.вместо того, чтобы обрабатывать ISO-8859-1, он работает в соответствии с вашими текущими настройками локали для сравнения строк и сортировки.Таким образом, вместо ISO-8859-1 вы должны думать о том, что он 8-битный.

0 голосов
/ 28 сентября 2010

Возможно, вам придется снова перенести данные из MySQL в SQLite.Я не думаю, что вы можете предсказуемо вернуться к правильному кодированию, так как кажется, что SQLite интерпретировал ввод utf8 как не-utf8 или наоборот, когда данные впервые поступили, поэтому не сохранял их в надлежащем формате.

Поэтому попробуйте перенести снова, убедившись, что вся цепочка данных между MySQL и SQLite знает о кодировке utf-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...