La longueur du stockage varchar dans MySQL
P粉455093123
P粉455093123 2024-04-01 15:50:34
0
1
365

Désolé, l'anglais n'est pas ma langue maternelle...:(

Je veux comprendre comment la longueur réelle de varchar est stockée dans le fichier mysql .ibd. J'ai donc décidé de faire un test comme celui-ci :

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

J'ai ouvert le fichier ibd via ultraEdit, et la longueur du varchar en hexadécimal est la suivante :

  • HEX 01 est la longueur de c4, la décimale est 1
  • HEX 03 est la longueur de c2, la décimale est 3
  • HEX 04 est la longueur de c1, la décimale est 4

Mais les valeurs de ces colonnes sont trop courtes et n'ont besoin que d'un octet pour compter, j'ai donc fait un autre test comme celui-ci :

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

Son fichier ibd est le suivant :

  • HEX 04 est la longueur de c1 car 'aaaa' ne comporte que 4 caractères
  • HEX 7F est la longueur de c2, qui est de 127 en décimal, car c2 = REPEAT('a',127)

Mais la longueur de C4 en hexadécimal est 64 81 ,十进制是 25729 。超过 356。我尝试加上两个十六进制,但是 64 + 81 = E5 十进制是 229,不等于 356.

Cela me rend confus, alors je veux savoir pourquoi l'hexagone pour c4 apparaît comme ça et comment le savoir 356

P粉455093123
P粉455093123

répondre à tous(1)
P粉744691205

Peut-être ceci :

  • x81 vaut 01, le bit haut est activé
  • Le bit haut signifie "ce nombre est continu"
  • La suite est x64
  • Assembler les pièces donne x0164 = décimal 356

Avez-vous trouvé où/comment le drapeau NULL apparaît ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal