当字符串包含非ASCII字符(如德语变音符号)时,我试图让PostgreSQL 8.4.3与其~*
运算符进行不区分大小写的模式匹配。数据库,终端和其他所有配置都使用UTF-8。
简而言之,这就是问题所在:
SELECT 'Ö' ~* 'ö'; -- false
还有其他变种可行:
SELECT 'Ö' ILIKE 'ö'; -- true
SELECT 'Ö' ~* '[Öö]'; -- true
SELECT LOWER('Ö') ~* 'ö'; -- true
这些替代方案都没有让我特别开心。 ILIKE不使用正则表达式。 [Öö]涉及重写搜索词。 LOWER()可能是最好的解决方法,但我真的希望让~*
运算符像它应该的那样工作。
提前致谢。
答案 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上的结果相同。看起来你的编码有问题。