Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php UTF-8从MySQL损坏为SQLite_Php_Sqlite_Utf 8 - Fatal编程技术网

Php UTF-8从MySQL损坏为SQLite

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ā

我正在将我编写的一个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ā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
和SQLite
PRAGMA编码返回
UTF-8
。它是使用PHP::PDO生成的。MySQL中的
显示tablename
的完整列是否也显示表本身具有正确的字符集?可以在其他类型的字符集列中ram utf-8,并且使用适当的事件链可能需要一段时间才能注意到。如果使用不太聪明的编辑器来清理语句,是否确定它没有将文件保存为ISO-8859或类似文件?是的,MySQL表报告为UTF8。我使用TextMate(Mac)进行更改,默认情况下是UTF-8。