2017-10-19 288 views
4

阅读完文档后,我了解到每个字符都有一个字节或两个字节长度的前缀以确定其长度。我也理解,对于varchar,每个字符的字节长度可能不同,具体取决于字符本身。SQL如何确定varchar中字符的长度?

所以我的问题是:

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

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

我希望这个问题很清楚,对于我犯的任何英语错误感到抱歉。谢谢

回答

2

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

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

如果高位是1,那么它是一个多字节字符。

enter image description here

https://en.wikipedia.org/wiki/UTF-8

+0

这也解释了它的图片。谢谢 :) – lelbil

2

如果你在谈论UTF-8,这不是它的工作原理。它使用每个字节中的最高位来指示字符继续到下一个字节,并且可以非常有效地存储一个,两个,三个或四个字节字符。这与UTF-32相反,其中每个字符自动为4个字节,这对于某些类型的文本显然是非常浪费的。

使用UTF-8或字符数为可变字节数的任何字符集时,字符串的长度与字符串的长度之间会有一个断开连接。在一个固定长度的系统中,像Latin1这个严格的8位,没有这样的漂移。

从内部来看,数据库最关心的是字节长度。在调用像LENGTH()这样的函数时,字符的长度只会被明确暴露,否则它只是一堆字节,如果有必要,可以被解释为一个字符串。

从历史上看,数据库以单个字节的字节长度存储字节长度,然后存储数据本身。这就是为什么VARCHAR(255)非常普遍:它是您可以用一个字节长度字段表示的最长的字符串。像Postgres这样的较新的数据库允许> 2GB的字符字段,所以它们使用四个或更多字节来表示长度。