ascii 152字符(“ÿ”)上的PostgreSQL上限函数

ascii 152字符(“ÿ”)上的PostgreSQL上限函数,sql,postgresql,unicode,Sql,Postgresql,Unicode,在Windows 7平台上,PostgreSQL版本为9.3.9,使用PgAdmin作为客户端,在包含例如ÿÿÿ的列上选择upper的结果返回null。如果存储了三个值,例如 "ada" "john" "mole" "ÿÿÿ" 除了包含ÿÿÿÿ的行之外,它们都以大写形式返回;这一排 没有任何回报,空 数据库编码方案为UTF8/UNICODE。设置客户端_编码具有相同的值UNICODE 这是数据库中的设置问题、操作系统问题还是bug 在数据库里?是否有一些推荐的解决方法 结果: select

在Windows 7平台上,PostgreSQL版本为9.3.9,使用PgAdmin作为客户端,在包含例如ÿÿÿ的列上选择upper的结果返回null。如果存储了三个值,例如

"ada"
"john"
"mole" 
"ÿÿÿ"
除了包含ÿÿÿÿ的行之外,它们都以大写形式返回;这一排 没有任何回报,空

数据库编码方案为UTF8/UNICODE。设置客户端_编码具有相同的值UNICODE

这是数据库中的设置问题、操作系统问题还是bug 在数据库里?是否有一些推荐的解决方法

结果:

select thecol, upper(thecol), upper(thecol) is null, convert_to(thecol, 'UTF8'), current_setting('server_encoding') from thetable where ... 
是:

pg_设置的lc_部分包括:

"lc_collate";"Swedish_Sweden.1252";"Shows the collation order locale."
"lc_ctype";"Swedish_Sweden.1252";"Shows the character classification and case conversion locale."
"lc_messages";"Swedish_Sweden.1252";"Sets the language in which messages are displayed."
"lc_monetary";"Swedish_Sweden.1252";"Sets the locale for formatting monetary amounts."
"lc_numeric";"Swedish_Sweden.1252";"Sets the locale for formatting numbers."
pg_数据库中select*的输出为:

9.4.4版本的实际create database语句为:

CREATE DATABASE postgres
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'Swedish_Sweden.1252'
       LC_CTYPE = 'Swedish_Sweden.1252'
       CONNECTION LIMIT = -1;
我猜上面的函数使用数据库的LC_CTYPE设置。带有分音符U+00FF的拉丁文小写字母Y的大写字母是带有分音符“U+0178”的拉丁文大写字母Y,它不是Windows 1252代码页的一部分

如果先将字符串转换为Unicode格式,则上面的函数可能会按预期工作:

SELECT upper(convert_to(thecol, 'UTF8')) ...
您可能应该为LC_CTYPE和LC_COLLATE使用不同的值。在Linux上,您将使用sv_SE.UTF-8


尽管如此,我还是认为这是一个错误。如果目标字符集中不能表示大写版本,最好保持ÿ的原样。

ASCII和Unicode不一样。对于ÿ,我得到的是Unicode值255 0xFF,对于Ÿ,得到的是376 0x178。另请参见列数据类型?char/varchar还是nchar/nvarchar?排序规则?列类型为字符可变的varchar,lc_collate=瑞典。1252如果我在376 0x178上运行select lower,我将返回。但是如果我以相反的方式操作,则为null/无,即在255 0xFFÿÿÿÿ@CraigRinger上选择upper,很抱歉造成混淆,ANSI SQL名称的NCHAR variating/国家字符variating/国家字符variating。Nvarchar只是一个流行的昵称。
CREATE DATABASE postgres
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'Swedish_Sweden.1252'
       LC_CTYPE = 'Swedish_Sweden.1252'
       CONNECTION LIMIT = -1;
SELECT upper(convert_to(thecol, 'UTF8')) ...