mysql中varchar存储的长度
P粉455093123
P粉455093123 2024-04-01 15:50:34
0
1
287

抱歉,英语不是我的母语...:(

我想了解 varchar 的实际长度如何存储在 mysql .ibd 文件中。所以我决定做一个这样的测试:

CREATE TABLE record_format_demo (
         c1 VARCHAR(10),
        c2 VARCHAR(10) NOT NULL,
         c3 CHAR(10),
         c4 VARCHAR(10)
     ) CHARSET=ascii ROW_FORMAT=COMPACT;

INSERT INTO record_format_demo(c1, c2, c3, c4) VALUES('aaaa', 'bbb', 'cc', 'd');

SELECT * FROM record_format_demo;
+------+-----+------+------+
| c1   | c2  | c3   | c4   |
+------+-----+------+------+
| aaaa | bbb | cc   | d    |
+------+-----+------+------+

我通过ultraEdit打开ibd文件,十六进制的varchar长度如下所示:

  • HEX 01 为 c4 的长度,十进制为 1
  • HEX 03 为 c2 的长度,十进制为 3
  • HEX 04 是 c1 的长度,十进制是 4

但是这些列的值太短,只需要一个字节就可以计数,所以我又做了一个这样的测试:

CREATE TABLE record_format_demo2 (
         c1 VARCHAR(10),
        c2 VARCHAR(256) NOT NULL,
         c3 CHAR(10),
         c4 VARCHAR(357)
     ) CHARSET=ascii ROW_FORMAT=COMPACT;
         
         
INSERT INTO record_format_demo2(c1, c2, c3, c4) VALUES('aaaa', REPEAT('a',127), 'cc', REPEAT('a', 356));

它的 ibd 文件如下:

  • HEX 04 是 c1 的长度,因为 'aaaa' 只有 4 个字符
  • HEX 7F 是 c2 的长度,十进制为 127,因为 c2 = REPEAT('a',127)

但是C4的长度的十六进制是 64 81 ,十进制是 25729 。超过 356。我尝试加上两个十六进制,但是 64 81 = E5 十进制是 229,不等于 356

这让我很困惑,所以我想知道为什么 c4 的十六进制显示这样,以及如何找出 356

P粉455093123
P粉455093123

全部回复(1)
P粉744691205

也许是这样:

  • x81 为 01,高位打开
  • 高位表示“这个数字是连续的”
  • 延续是 x64
  • 将各个部分放在一起得出 x0164 = 十进制 356

您是否找到了 NULL 标志在何处/如何出现?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!