Как функция длины SQL обрабатывает графемы Unicode?
Рассмотрим следующий сценарий, где у меня есть строка É
определяется \U00000045\U00000301
,
1) https://www.fileformat.info/info/unicode/char/0045/index.htm
2) https://www.fileformat.info/info/unicode/char/0301/index.htm
Будет ли стол ограничен varchar(1)
рассматривайте это как допустимый ввод 1 символа. Или это будет отклонено, потому что это считается вводом 2 символов?
Как SQL обычно обрабатывает длину строк с графемами в них?
1 ответ
Решение
Я, вероятно, выгляжу глупо с этим запросом, но все же:
t=# with c(u) as (values( e'\U00000045\U00000301'))
select u, u::varchar(1), u::varchar(2),char_length(u), octet_length(u) from c;
u | u | u | char_length | octet_length
---+---+---+-------------+--------------
É | E | É | 2 | 3
(1 row)
редактировать
t=# show server_encoding ;
server_encoding
-----------------
UTF8
(1 row)
t=# \l+ t
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
------+-------+----------+---------+-------+-------------------+-------+------------+-------------
t | vao | UTF8 | C | UTF-8 | | 51 MB | pg_default |
(1 row)