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 :
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 :
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
Peut-être ceci :
Avez-vous trouvé où/comment le drapeau NULL apparaît ?