我在 Linux 上使用 PostgreSQL 9.6。当我对chr()函数进行测试时出现错误。
postgres=# select chr(1199111);
ERROR: requested character too large for encoding: 1199111
postgres=# select chr(55296);
ERROR: requested character not valid for encoding: 55296
postgres=# select chr(100000);
chr
-----
?
(1 row)
在这里,正如您所看到的 value100k
它起作用(没有引发错误),但其他人没有。我对此很好奇。有人可以向我解释为什么吗?
我附上测试脚本
do
$$
declare
str text ;
begin
for i in 1..1200000
loop
begin
select chr(i) into str;
exception when others then raise notice '=> i: % => str: %', i , str ;
#exit; -- you can uncomment this star key
end ;
end loop;
end
$$ ;
更新
postgres=# show server_encoding;
server_encoding
-----------------
UTF8
(1 row)
因为它没有引发错误,并不意味着它有效。这些都不起作用,但只有其中一个荒谬到
chr()
爆炸。186A0
) 映射到 Supplementary Multilingual Plane,但那里(还)什么都没有。U+D800
) 映射到 Basic Multilingual Plane,但什么都没有(还)。U+124C07
) 甚至无效,它映射到一个如此之高的平面,以至于 Unicode 甚至不支持它。Unicode 仅支持 1,111,998:17 个平面 × 每个平面 65,536 个字符 - 2048 个代理项 - 66 个非字符。有关详细信息,请参阅此答案。111万个码位,远远少于119万个码位。