如何使用与PostgreSQL和Umlauts不区分大小写的模式匹配?

时间:2010-06-23 19:17:38

标签: postgresql design-patterns case-insensitive matching diacritics

当字符串包含非ASCII字符(如德语变音符号)时,我试图让PostgreSQL 8.4.3与其~*运算符进行不区分大小写的模式匹配。数据库,终端和其他所有配置都使用UTF-8。

简而言之,这就是问题所在:

SELECT 'Ö' ~* 'ö';      -- false

还有其他变种可行:

SELECT 'Ö' ILIKE 'ö';     -- true
SELECT 'Ö' ~* '[Öö]';     -- true
SELECT LOWER('Ö') ~* 'ö'; -- true

这些替代方案都没有让我特别开心。 ILIKE不使用正则表达式。 [Öö]涉及重写搜索词。 LOWER()可能是最好的解决方法,但我真的希望让~*运算符像它应该的那样工作。

提前致谢。

2 个答案:

答案 0 :(得分:3)

这是9.0之前的PostgreSQL版本中的一个错误 它位于9.0更改日志中:http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99075

这是我使用Ubuntu在9.0 beta2中的测试:

SELECT 'Ö' ~* 'ö';
 ?column? 
----------
 t
(1 row)

答案 1 :(得分:1)

我对此查询的确如此:

SELECT 'Ö' ~* 'ö'; -- true

但我在OS X 10.5.8上使用版本9.0beta2进行了以下设置:

CREATE DATABASE test
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'nl_NL.UTF-8'
       LC_CTYPE = 'nl_NL.UTF-8'
       CONNECTION LIMIT = -1;

编辑:版本8.3.7上的结果相同。看起来你的编码有问题。