Php UTF-8从MySQL损坏为SQLite
我正在将我编写的一个PHP Web应用程序从MySQL 5移植到SQLite 3。两者的文本编码都是UTF-8(适用于所有字段、表和数据库)。我在传输带有特殊字符的地理数据库时遇到问题Php UTF-8从MySQL损坏为SQLite,php,sqlite,utf-8,Php,Sqlite,Utf 8,我正在将我编写的一个PHP Web应用程序从MySQL 5移植到SQLite 3。两者的文本编码都是UTF-8(适用于所有字段、表和数据库)。我在传输带有特殊字符的地理数据库时遇到问题 mb\u detect\u encoding()将两者都检测为返回UTF-8数据 比如说, 原始输出: $sqlite_output = utf8_encode($sqlite_output); $sqlite_output = utf8_decode($sqlite_output); MySQL(正确):Dā
mb\u detect\u encoding()
将两者都检测为返回UTF-8数据
比如说,
原始输出:
$sqlite_output = utf8_encode($sqlite_output);
$sqlite_output = utf8_decode($sqlite_output);
MySQL(正确):Dārāb,伊朗SQLite(不正确):DÄrÄb,伊朗 JSON编码:
$sqlite_output = utf8_encode($sqlite_output);
$sqlite_output = utf8_decode($sqlite_output);
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输入解释为非utf8,或者反之亦然,因此没有以正确的格式存储它
因此,请再次尝试传输,同时确保MySQL到SQLite之间的整个数据链都知道utf-8编码。好的,谢谢您的建议和评论。不幸的是,无论我选择哪种配置,它都不需要。最后,我简单地启动了两个PDO对象,并使用
while
循环,一次插入一行。(我使用了mysqldump
的--无数据
选项来获取结构,并手动修改了它。)
在我的256MB CentOS设备上插入约10000行数据(相当于9.4MB的数据)大约需要10分钟。(因此,如果您在共享环境中,请注意最大执行时间。)SQLite数据库现在返回正确的Unicode数据
self注意:编写变通方案比找到推荐的解决方案更容易。默认的PHP发行版以ISO-8859-1编码模式构建libsqlite。然而,这是一个用词不当;它不是处理ISO-8859-1,而是根据您当前的语言环境设置进行字符串比较和排序。因此,与其说是ISO-8859-1,不如说是“8位” 您使用什么来传输数据?问题在哪一点出现?mySQL和SQLite端到底使用了什么字符集和排序规则?我使用了
mysqldump
到sqlite3。在清理语句以确保兼容性后读取,但不涉及数据。MySQL是utf8\u general\u ci
和SQLitePRAGMA编码代码>返回UTF-8
。它是使用PHP::PDO生成的。MySQL中的显示tablename
的完整列是否也显示表本身具有正确的字符集?可以在其他类型的字符集列中ram utf-8,并且使用适当的事件链可能需要一段时间才能注意到。如果使用不太聪明的编辑器来清理语句,是否确定它没有将文件保存为ISO-8859或类似文件?是的,MySQL表报告为UTF8。我使用TextMate(Mac)进行更改,默认情况下是UTF-8。