UTF-8 Поврежден от MySQL до SQLite

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

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

Например,

Сырье:

MySQL (правильно): Dārāb, Иран
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. Заранее спасибо.

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

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

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

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

Примечание для себя: легче закодировать рабочий процесс, чем найти рекомендуемое решение.

По умолчанию PHP-дистрибутив создает libsqlite в режиме кодирования ISO-8859-1. Однако это неправильное название; вместо обработки ISO-8859-1, он работает в соответствии с вашими текущими настройками локали для сравнения строк и сортировки сортировки. Поэтому, вместо ISO-8859-1, вы должны думать, что это как «8-бит».