SQL 如何确定 varchar 中字符的长度?

How does SQL determine a character's length in a varchar?

看了文档才明白,可变字符有一个字节或两个字节的长度前缀来确定它的长度。我也明白,对于 varchar,每个字符可能有不同的字节长度,具体取决于字符本身。

所以我的问题是:

DBMS如何确定每个字符存储后的长度?

含义:一个字符串存储后,假设它有4个字符长,假设第一个字符长1个字节,第二个2字节,第三个3字节,第四个4.. 数据库在检索字符串时如何知道每个字符有多长以便正确读取?

我希望问题很清楚,对于我犯的任何英语错误,我深表歉意。谢谢

如果您谈论的是 UTF-8,那并不是它的工作原理。它使用每个字节中的最高位来表示该字符继续进入下一个字节,并且可以相当高效地存储一个、两个、三个或四个字节的字符。这与 UTF-32 形成对比,UTF-32 每个字符自动为四个字节,这对于某些类型的文本来说显然是非常浪费的。

当使用 UTF-8 或字符的字节数可变的任何字符集时,字符串的字节长度与字符串的字符长度之间存在脱节。在像 Latin1 这样严格为 8 位的固定长度系统中,没有这种漂移。

数据库内部最关心字段的字节长度。字符长度仅在调用 LENGTH() 等函数时显式公开,否则它只是一堆字节,如有必要,可以将其解释为字符串。

从历史上看,数据库将字段的长度(以字节为单位)存储在单个字节中,然后是数据本身。这就是 VARCHAR(255) 如此普遍的原因:它是您可以用单个字节长度字段表示的最长字符串。较新的数据库(如 Postgres)允许大于 2GB 的字符字段,因此它们使用四个或更多字节来表示长度。

UTF-8 作为可变长度编码的工作方式是 1 字节字符只能使用该字节的 7 位。

如果高位为0,则该字节为1个字节的字符(恰好与128个ASCII字符的编码方式相同)。

如果高位为1,则为多字节字符

图片来自https://en.wikipedia.org/wiki/UTF-8