标题总结得很好。我正在寻找一个匹配Postgres~运算符的Unicode大写字符的正则表达式。 显而易见的方法不起作用:
=> select 'A' ~ '[[:upper:]]';
?column?
----------
t
(1 row)
=> select 'Ó' ~ '[[:upper:]]';
?column?
----------
t
(1 row)
=> select 'Ą' ~ '[[:upper:]]';
?column?
----------
f
(1 row)
我正在使用Postgresql 9.1,我的语言环境设置为pl_PL.UTF-8。订购工作正常。
=> show LC_CTYPE;
lc_ctype
-------------
pl_PL.UTF-8
(1 row)
答案 0 :(得分:4)
PG 9.1和旧版本的regexp引擎无法正确分类其代码点不适合一个字节的字符。
'Ó'
的代码点为211,它正确,但'Ą'
的代码点为260,超过255。
PG 9.2在这方面做得更好,但对所有字母表仍然不是100%正确。请参阅PostgreSQL源代码中的commit,特别是注释的这些部分:
删除硬连线限制,不考虑wctype.h的结果 字符代码高于255
和
尽管如此,我们还是可以把它推到U + 7FF(我选择了它作为极限 2字节UTF8字符),这将至少使东欧人 快乐等待更好的解决方案
不幸的是,这并没有被移植到9.1
答案 1 :(得分:1)
我发现perl正则表达式可以完美地处理Unicode。
create extension plperl;
create function is_letter_upper(text) returns boolean
immutable strict language plperl
as $$
use feature 'unicode_strings';
return $_[0] =~ /^\p{IsUpper}$/ ? "true" : "false";
$$;
使用perl 5.16.2在postgres 9.2上测试。