如何使用 PostgreSQL 和 Umlauts 的不区分大小写的模式匹配?
当字符串包含非 ASCII 字符(如德语变音符号)时,我试图让 PostgreSQL 8.4.3 与其 ~*
运算符进行不区分大小写的模式匹配。数据库、终端和其他所有内容都配置为使用 UTF-8。
简而言之,问题是这样的:
SELECT 'Ö' ~* 'ö'; -- false
还有其他可行的变体:
SELECT 'Ö' ILIKE 'ö'; -- true
SELECT 'Ö' ~* '[Öö]'; -- true
SELECT LOWER('Ö') ~* 'ö'; -- true
这些替代方案都没有让我特别高兴。 ILIKE 不使用正则表达式。 [Öö] 涉及重写搜索词。 LOWER() 可能是最好的解决方法,但我真的很想让 ~*
运算符像预期的那样工作。
提前致谢。
I'm trying to get PostgreSQL 8.4.3 to do case insensitive pattern matching with its ~*
operator when the strings contain non-ASCII characters like German umlauts. The database, terminal, and everything else is configured to use UTF-8.
Here's the problem in a nutshell:
SELECT 'Ö' ~* 'ö'; -- false
There are other variants which do work:
SELECT 'Ö' ILIKE 'ö'; -- true
SELECT 'Ö' ~* '[Öö]'; -- true
SELECT LOWER('Ö') ~* 'ö'; -- true
None of these alternatives make me especially happy. ILIKE doesn't use regular expressions. [Öö] involves rewriting the search term. LOWER() is probably the best workaround, but I'd really like to get the ~*
operator working like it's supposed to.
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是 9.0 之前的 PostgreSQL 版本中的错误。
它位于 9.0 变更日志中: http://www. postgresql.org/docs/9.0/static/release-9-0.html#AEN99075
这是我使用 Ubuntu 在 9.0 beta2 中进行的测试:
This is a bug in PostgreSQL versions prior to 9.0.
It's in the 9.0 changelog: http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99075
Here is my test in 9.0 beta2 using Ubuntu:
我对这个查询的理解是正确的:
但我确实在 OS X 10.5.8 上使用了版本 9.0beta2 并进行了这些设置:
编辑:版本 8.3.7 上的结果相同。看来您的编码有问题。
I get true with this query:
But I did use version 9.0beta2 at OS X 10.5.8 with these settings:
Edit: Same result on version 8.3.7. Looks like you have a problem with the encoding.