InnoDB хранит многобайтовые строки в расширенной форме, в индексах? - PullRequest
1 голос
/ 13 мая 2019

Хранит ли InnoDB многобайтовые строки в развернутой форме, в индексах?

Например, каждая ли строка utf8mb4 занимает 4 байта?

Я пытался проверить это эмпирически из information_schema.tables.index_length, однако, значение не является детерминированным, поэтому это не надежный метод.Я также не смог найти эту концепцию в документации.

Редактировать: чтобы уточнить, вопрос в двух словах: сколько байт требуется для хранения 1-байтового символа utf8mb4 (скажем, U+0050) в индексе InnoDB для столбца CHAR(1) NOT NULL (без учета метаданных индекса)?

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Например, занимает ли каждая utf8mb4 строка символ 4 байта? - Каждый символ занимает до 4 байта.

Вы можете использовать LENGTH(col), чтобы найти число байтов в столбце.
Вы можете использовать CHAR_LENGTH(col), чтобы найти количество символов в столбце.

Эти два числа будут в соотношении где-то между 1: 1 и 4: 1. Английский будет 1: 1; Западная Европа: от 1: 1 до 2: 1; Русский и греческий будут 2: 1; большинство азиатских языков будут 3: 1; Строки с Emoji могут быть близки к 4: 1.

Вы не найдете 6 символов "U + 0050" в таблицах MySQL, если вы не прошли некоторую кодировку. Не делай этого.

information_schema.tables.index_length указывает, сколько места используется для всех вторичных индексов. Существует много причин, по которым это не связано с вашим вопросом - накладные расходы BTree, служебные данные блоков, служебные данные строк, служебные данные столбцов, указатели на подузлы и т. Д. И т. Д.

0 голосов
/ 13 мая 2019

Все символы в строке utf8 хранятся как кодировки переменной длины. Каждый символ использует 1, 2, 3 или 4 байта в зависимости от его кодовой точки. Строка может иметь сочетание кодировок, потому что каждая кодовая точка идентифицирует свою длину в начальных битах каждого байта.

enter image description here

Символы, входящие в подмножество ASCII, будут использовать только 1 байт.

...