ascii 152字符(“ÿ”)上的PostgreSQL上限函数
在Windows 7平台上,PostgreSQL版本为9.3.9,使用PgAdmin作为客户端,在包含例如ÿÿÿ的列上选择upper的结果返回null。如果存储了三个值,例如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
"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')) ...