首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL编码转换误差

PostgreSQL编码转换误差
EN

Database Administration用户
提问于 2014-02-03 10:13:18
回答 1查看 2.4K关注 0票数 0

我有一个LATIN9编码的Postgresql数据库。

我最近将我的web应用程序(PHP)从iso_8859_15 (latin9)迁移到了UTF8。

因此,现在,客户可以指定UTF-8字符在网络形式,如评论形式或联系形式。

我从PHP (PHP函数pg_set_client_encoding('UTF8')左右)用UTF-8编码打开PG连接。

对于标准人物来说很管用,比如“阿豪”.PG能够将它们从UTF-8转换到LATIN9 (数据库编码)。但是,如果有人插入一些外来字符,如日本字符"日本語“,则会引发如下错误:

代码语言:javascript
复制
ERROR:  character with byte sequence 0xe6 0x97 0xa5 in encoding "UTF8" has no equivalent in encoding "LATIN9"

我知道我应该将我的数据库迁移到utf8来解决这个问题,但出于某些原因,我暂时不能这么做。

在我的例子中,我宁愿PostgreSQL保存我的字符串,删除它不能转换的字符,或者例如用"?“这样的符号替换它们。而不是抛出一个错误。

我认为让事情像这样工作的唯一方法是在LATIN9中打开我的连接,并使用像这样工作的utf8_decode() PHP函数(用"?“替换未知字符)。文号)

用一种更好的方式做这件事有可能吗?也许是PG参数(但我在postgresql.conf中没有看到这样的参数)

或者有人对如何处理这件事有其他想法?

谢谢,

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-02-03 12:22:56

我知道我应该把我的数据库迁移到utf8来解决这个问题,但是出于某些原因,我暂时不能这么做。在我的例子中,我宁愿PostgreSQL保存我的字符串,删除它不能转换的字符,或者例如用"?“这样的符号替换它们。而不是抛出一个错误。

PostgreSQL不支持这一点。它是定期被请求的,但是没有人要求它在系统中实际实现它,并且说服开发团队它是一个合适的选择。

你需要做你的文本破坏客户端。在PHP中,在将文本发送到PostgreSQL之前,需要筛选出与数据库编码不匹配的字符。如何做到这一点完全是特定于PHP的(可能是从iconv支持开始)。您已经描述了一种使用utf8_decode进行此操作的方法。

使用utf8_decode实际上是不正确的,因为函数(每个文档)实际上假设输入是ISO8859-1,即拉丁文1。你用的是拉丁文-9,即ISO-8859-15。所以它会破坏你的一些输入字符,特别是欧元符号。见更改ISO-8859-1。相反,使用iconv函数。请参阅关于utf8_decode函数文档的非常有用的注释。

如果在筛选文本的过程中,在PHP中将文本转换为latin9,请记住,必须将client_encoding设置为LATIN9,因为这是要发送给PostgreSQL的文本的编码。这意味着结果也将是拉丁文-9,所以您必须将来自PostgreSQL的所有结果从拉丁语-9转换回PHP本机utf-8。

如果您使用utf8_encode将PostgreSQL中的拉丁-9输出转换为在PHP中消费,那么拉丁-1与拉丁-9的问题将与utf8_decode上的问题相同。

因此,如果可能的话,尝试使用一个过滤器来替换拉丁-9中不支持的字符,而不实际将字符串转换为拉丁语-9。如果您可以将client_encoding设置为utf-8,并且只损坏您的字符串而不是转换它们,它将为您节省一堆麻烦。

尽管如此,我强烈建议将数据库升级为utf-8。将其保留在拉丁语-9中的唯一原因是,如果您有其他客户端应用程序无法处理拉丁-9范围之外的字符(即它们依赖于拉丁语-9 client_encoding)。

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

https://dba.stackexchange.com/questions/58125

复制
相关文章

相似问题

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