首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL + PHP + UTF8 =用于编码的字节序列无效

PostgreSQL + PHP + UTF8 =用于编码的字节序列无效
EN

Stack Overflow用户
提问于 2009-11-05 08:23:55
回答 2查看 9.6K关注 0票数 10

我正在将数据库从mysql迁移到postgresql。mysql数据库的默认排序规则是UTF8,postgres也使用UTF8,我使用pg_escape_string()对数据进行编码。然而,不管是什么原因,我遇到了一些关于糟糕编码的时髦错误:

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

我一直在尝试弄清楚这一点,并注意到php做了一些奇怪的事情;如果一个字符串中只有ascii字符(例如。"hello"),编码为ASCII。如果字符串包含任何非ascii字符,则说明编码为UTF8 (例如,"Hëllo")。

当我对已经是UTF8的字符串使用utf8_encode()时,它会杀死特殊字符并使它们变得一团糟,所以..我该怎么做才能让它正常工作呢?

(现在挂起它的确切字符是"�",但我希望找到一个更好的解决方案,这样这种问题就不会再次发生)

EN

回答 2

Stack Overflow用户

发布于 2009-12-23 16:49:00

最有可能的是,MySQL数据库中的数据不是UTF8。这是一个非常常见的场景。MySQL至少过去根本不对数据做任何适当的验证,所以只要你的客户端声称它是UTF8,它就会接受你抛给它的任何东西。到目前为止,他们可能已经解决了这个问题(或者没有,我甚至不知道他们是否认为这是一个问题),但是你可能已经在数据库中有了错误编码的数据。当然,PostgreSQL会在您加载它时执行完整的验证,因此它可能会失败。

你可能想通过像iconv这样的东西来输入数据,它可以设置为忽略未知字符,或者将它们转换为“最佳猜测”。

票数 6
EN

Stack Overflow用户

发布于 2009-11-05 12:52:39

顺便说一句,ASCII字符串在UTF-8中完全相同,因为它们共享相同的前127个字符;因此ASCII中的"Hello“与UTF-8中的"Hello”完全相同,不需要进行转换。

表中的排序规则可以是UTF-8,但您可能不会以相同的编码从其中提取信息。现在,如果您对提供给pg_escape_string的信息有问题,这可能是因为您假设从MySQL获取的内容是以UTF8编码的,而事实并非如此。我建议您查看this page on MySQL documentation并查看您的连接的编码;您可能是从一个表中提取的,该表的排序规则是UTF-8,但是您的连接类似于拉丁-1(其中诸如çéèêöà等特殊字符不会以UTF-8编码)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1677595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档