Postgresql 用多字符串替换字符
我正试图取代德国和荷兰的元音,如Postgresql 用多字符串替换字符,postgresql,encoding,replace,diacritics,Postgresql,Encoding,Replace,Diacritics,我正试图取代德国和荷兰的元音,如ä,ü,或ß。它们应该像ae那样编写,而不是像a那样编写。所以我不能简单地把一个字符翻译成另一个字符 有没有更优雅的方法?实际上看起来是这样的(尚未完成): 在尝试不同命令的过程中,我遇到了另一个问题: 当我搜索Ü时,我得到了以下信息: 错误:编码“UTF8”的字节序列无效:0xdc27 用U&'\0220'尝试过,但没有替换任何内容。只有通过使用ü(小写ü)才能正确替换。必须使用unicode,但是如何解决这个问题呢 来自德国的亲切问候。:) 您的服务器编码似
ä
,ü
,或ß
。它们应该像ae
那样编写,而不是像a
那样编写。所以我不能简单地把一个字符翻译成另一个字符
有没有更优雅的方法?实际上看起来是这样的(尚未完成):
在尝试不同命令的过程中,我遇到了另一个问题:
当我搜索Ü
时,我得到了以下信息:
错误:编码“UTF8”的字节序列无效:0xdc27
用U&'\0220'
尝试过,但没有替换任何内容。只有通过使用ü
(小写ü
)才能正确替换。必须使用unicode,但是如何解决这个问题呢
来自德国的亲切问候。:) 您的服务器编码似乎是UTF8。
我怀疑你的
客户编码不匹配,这可能会给你一个错误的印象。检查:
SHOW client_encoding; -- in your actual session
阅读以下相关答案:
工具链的其余部分也必须同步。例如,在使用puTTY时,必须确保终端与其他终端一致:更改设置。。。窗口->翻译->远程字符集
=UTF-8
至于你的第一个问题,你已经有了最好的解决方案。最好用一组replace()
语句替换两个UMLAUT
正如您似乎已经知道的,使用(单个)语句进行单字符替换更有效
相关的:
除其他原因外,我决定用python编写替换代码。像Erwin以前写的那样,似乎没有更好的解决方案可以组合replace
-命令
一般来说相当简单,甚至不需要使用编码。我的“最终”解决方案现在如下所示:
ger_UE="Ü"
ger_AE="Ä"
ger_OE="Ö"
ger_SS="ß"
dk_AA="Å"
dk_OE="Ø"
dk_AE="Æ"
cur.execute("""Select addr, REPLACE (REPLACE (REPLACE( REPLACE (REPLACE (REPLACE (REPLACE(addr, '%s','UE'),'%s','OE'),'%s','AE'),'%s','SS'),'%s','AA'),'%s','OE'),'%s','AE')
from search WHERE x = '1';"""%(ger_UE,ger_OE,ger_AE,ger_SS,dk_AA,dk_OE,dk_AE))
我现在期待着它击中大桌子时的速度。如果有人想做一些注释,我们非常欢迎
感谢您的回复和问候。我不太确定客户机/服务器编码是否不匹配。根据我的经验,这些类型的映射失败通常会导致“character has not equired”错误。“无效字节序列”听起来更像是client\u编码设置为UTF8,但客户端程序仍在发送ANSI数据。@NickBarnes:嗯,客户端发送根据clent\u编码编码的数据<代码>客户端编码
是双向的。所以我们可能在这里谈论同样的事情,不完全是。服务器根据客户机编码解释客户机的数据,但是客户机可以发送它想要的任何内容。例如,如果我在Windows中启动psql
,它默认为WIN1252。如果运行将客户机_编码设置为“UTF8”
并选择“Ü”
,则会出现“无效字节序列”错误psql
不知道有什么变化;它仍然以ANSI的形式发送数据。@NickBarnes:说得好。我在前面评论中的描述不太正确。例如,当使用腻子时,必须确保端子与其他端子一致<代码>更改设置。。。窗口->翻译->远程字符集:UTF-8
@Erwin:这就是重点。我正在使用超级按钮,必须将字符集更改为UTF-8。虽然问题应该得到解决-但是:选择一个在街道内有umlaut的地址,umlaut仍然不能正确显示。相反,我得到的是Ã
而不是ß
。然而,我的问题解决了。谢谢大家!Unicode转义序列是十六进制的;您需要U&'\00DC'
ger_UE="Ü"
ger_AE="Ä"
ger_OE="Ö"
ger_SS="ß"
dk_AA="Å"
dk_OE="Ø"
dk_AE="Æ"
cur.execute("""Select addr, REPLACE (REPLACE (REPLACE( REPLACE (REPLACE (REPLACE (REPLACE(addr, '%s','UE'),'%s','OE'),'%s','AE'),'%s','SS'),'%s','AA'),'%s','OE'),'%s','AE')
from search WHERE x = '1';"""%(ger_UE,ger_OE,ger_AE,ger_SS,dk_AA,dk_OE,dk_AE))