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)
中可以工作,尝试插入🇦🇶不可以。这是它的工作方式吗?或者它更复杂?
1条答案
按热度按时间n3schb8v1#
你可以使用
length()
或者等价的char_length()
函数来测量字符串的长度。这些函数计算字符串中的码点数,这也是由character varying
的类型修饰符分隔的。PostgreSQL将组合字符的长度计算为所涉及的码点数。