我正在将数据库从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()时,它会杀死特殊字符并使它们变得一团糟,所以..我该怎么做才能让它正常工作呢?
(现在挂起它的确切字符是"�",但我希望找到一个更好的解决方案,这样这种问题就不会再次发生)
发布于 2009-12-23 16:49:00
最有可能的是,MySQL数据库中的数据不是UTF8。这是一个非常常见的场景。MySQL至少过去根本不对数据做任何适当的验证,所以只要你的客户端声称它是UTF8,它就会接受你抛给它的任何东西。到目前为止,他们可能已经解决了这个问题(或者没有,我甚至不知道他们是否认为这是一个问题),但是你可能已经在数据库中有了错误编码的数据。当然,PostgreSQL会在您加载它时执行完整的验证,因此它可能会失败。
你可能想通过像iconv这样的东西来输入数据,它可以设置为忽略未知字符,或者将它们转换为“最佳猜测”。
发布于 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编码)。
https://stackoverflow.com/questions/1677595
复制相似问题