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



PostgreSQL文档非常明确地指出,VARCHAR(n)指的是一种可以存储长度为n个字符(而不是字节)的字符串的类型。真是个"人物"!实际上,这取决于为数据库选择的编码(Postgres支持lot)。

为了简单起见,我们假设使用的是一个使用UTF-8编码的数据库。那么问题来了:如果我们指定了一个VARCHAR(n)类型,我们就可以存储n字符,就像Postgres所说的那样,但是对于Postgres来说,字符究竟是由什么组成的呢?如果我们想要检查,在另一种语言中,某个字符串是否适合VARCHAR(n),我们应该检查什么?

稍微解释一下:首先,毫无疑问,一些UTF-8代码点需要超过1字节的存储空间。例如,😀需要4字节,并且十六进制表示为0xf09f9880

当我们查看单个字符时,问题就复杂了,这些字符由多个UTF-8码点

表示。例如🇦🇶(南极旗)由两个代码点组成:U+1F1E6🇦和U+1F1F6🇶。当这些代码点依次出现时,它们形成一个可见的字符,即南极旗。Postgres认为这是一个字符,为一个Varchar?还是2?从一些测试来看,Postgres UTF-8字符似乎是一个代码点。试图插入😀到VARCHAR(1)工作,试图插入🇦🇶没有。这就是它的工作原理吗?还是更复杂?

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