Panjang storan varchar dalam mysql
P粉455093123
P粉455093123 2024-04-01 15:50:34
0
1
361

Maaf, bahasa Inggeris bukan bahasa ibunda saya...:(

Saya ingin memahami bagaimana panjang sebenar varchar disimpan dalam fail mysql .ibd. Jadi saya memutuskan untuk melakukan ujian seperti ini:

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    |
+------+-----+------+------+

Saya membuka fail ibd melalui ultraEdit, dan panjang varchar dalam perenambelasan adalah seperti berikut:

  • HEX 01 ialah panjang c4, perpuluhan ialah 1
  • HEX 03 ialah panjang c2, perpuluhan ialah 3
  • HEX 04 ialah panjang c1, perpuluhan ialah 4

Tetapi nilai lajur ini terlalu pendek dan hanya memerlukan satu bait untuk dikira, jadi saya melakukan ujian lain seperti ini:

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));

Fail ibdnya adalah seperti berikut:

  • HEX 04 ialah panjang c1 kerana 'aaaa' hanya 4 aksara
  • HEX 7F ialah panjang c2, iaitu 127 dalam perpuluhan, kerana c2 = REPEAT('a',127)

Tetapi panjang C4 dalam perenambelasan ialah 64 81 ,十进制是 25729 。超过 356。我尝试加上两个十六进制,但是 64 + 81 = E5 十进制是 229,不等于 356.

Ini mengelirukan saya, jadi saya ingin tahu mengapa hex untuk c4 muncul seperti ini dan bagaimana untuk mengetahuinya 356

P粉455093123
P粉455093123

membalas semua(1)
P粉744691205

Mungkin ini:

  • x81 ialah 01, bit tinggi dihidupkan
  • Bit tinggi bermaksud "nombor ini berterusan"
  • Kesinambungan ialah x64
  • Menggabungkan bahagian-bahagian memberikan x0164 = perpuluhan 356

Adakah anda mendapati di mana/bagaimana bendera NULL muncul?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan