Я переношу веб-приложение 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-бит».