UTF-8编码下PostgreSQL的VARCHAR长度判定规则解析
PostgreSQL中VARCHAR(n)的"字符"定义与验证逻辑
PostgreSQL官方文档明确说明,VARCHAR(n)是最多可存储n个字符(而非字节)的类型,"字符"的具体定义取决于数据库的编码。我们以UTF-8编码场景为例展开讨论:
核心问题
当指定VARCHAR(n)类型时,PostgreSQL定义的"字符"究竟指什么?在其他语言中验证字符串能否存入VARCHAR(n)时,实际需要检查什么?
基础情况:单码点字符
部分UTF-8码点需要多字节存储,例如😀需要4字节(十六进制0xf09f9880),但PostgreSQL会将其视为1个字符,因此可以插入VARCHAR(1)类型的字段。
复杂场景:组合可视字符
单个可视字符可能由多个UTF-8码点组成,例如🇦🇶(南极旗)由U+1F1E6和U+1F1F6两个码点构成,二者组合形成一个完整的可视字符。
实际验证结论
测试显示,PostgreSQL在UTF-8编码下的"字符"本质是UTF-8码点:将😀插入VARCHAR(1)可行,但插入由两个码点组成的🇦🇶则会失败,因为它会被计数为2个字符。
目前没有更复杂的特殊规则,PostgreSQL对VARCHAR(n)的字符计数严格基于UTF-8码点的数量,而非视觉上的单个字符或字节数。
内容的提问来源于stack exchange,提问作者ouroboring
相关产品推荐
相关产品推荐

