mysql中varchar儲存的長度
P粉455093123
P粉455093123 2024-04-01 15:50:34
0
1
286

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

我想了解 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學習者快速成長!