postgresql 如何确定Postgres VARCHAR的长度(UTF-8)?

wljmcqd8  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(360)

PostgreSQL documentation非常具体,VARCHAR(n)指的是一种可以存储长度为n个字符(* 不是 * 字节)的字符串的类型。“字符”实际上是什么取决于为数据库选择的编码(Postgres supports lots)。
为了简单起见,假设我们正在使用UTF-8编码的数据库。那么问题是:如果我们指定一个VARCHAR(n)类型,我们可以存储n“字符”,正如Postgres所称的那样,但是究竟是什么构成了Postgres的字符呢?如果我们想在另一种语言中检查某个字符串是否适合VARCHAR(n),我们实际上应该检查什么?
把这个稍微拆开一点:首先,一些UTF-8代码点需要存储超过1个字节。例如,😀需要4个字节,并且有十六进制表示0xf09f9880。这可能应该被认为是1个字符。
当我们看到单个 * 字符 * 时,复杂性就来了,这些字符用多个UTF-8 codepoint 表示。例如🇦🇶(南极洲旗)由两个codepoint组成:U+1F 1 E6🇦和U+1F 1F 6🇶。当这些代码点顺序出现时,它们形成一个可见的字符,南极洲旗帜。Postgres认为这是1个字符,对于Varchar?还是2个?
从一些测试来看,Postgres UTF-8字符似乎是一个代码点。尝试插入😀到VARCHAR(1)中可以工作,尝试插入🇦🇶不可以。这是它的工作方式吗?或者它更复杂?

n3schb8v

n3schb8v1#

你可以使用length()或者等价的char_length()函数来测量字符串的长度。这些函数计算字符串中的码点数,这也是由character varying的类型修饰符分隔的。PostgreSQL将组合字符的长度计算为所涉及的码点数。

相关问题