Я пытаюсь получить глубокое представление о СУБД, я изучаю MariaDB.
Пытаюсь получить тип данных Binary и то, как работает его сопоставление.
Я понимаю, что тип данных binary(n) занимает n байт. Это означает, что наименьшая память, которая может быть выделена, составляет 1 байт?
Это взято из документации MariaDB:
Тип BINARY подобен типу CHAR, но хранит двоичные строки байтов, а не недвоичные строки символов. M представляет длину столбца в байтах. Он не содержит набора символов, а сравнение и сортировка основаны на числовом значении байтов.
У меня есть следующие подвопросы:
Я создал несколько таблиц, чтобы проверить это,
Сначала я создаю таблицу, чтобы проверить это с помощью Binary(1), это не позволяет мне добавить более 1 цифры 0-9 или 1 символ A-Z или az
Затем я создал таблицу с помощью Binary(10), чтобы посмотреть, как работает порядок сортировки.
CREATE TABLE BinaryEg1(
b BINARY(1)
);
-- Adding two binary digits
INSERT INTO BinaryEg1 VALUES (0), (1);
-- Throws error, too long
INSERT INTO BinaryEg1 VALUES (10);
-- Adding basic chars to compare sort
INSERT INTO BinaryEg1 VALUES ('A'), ('a'), ('B'), ('b');
Здесь, если я вижу порядок сортировки по умолчанию, он помещает числа перед заглавными буквами, а затем строчными буквами:
SELECT * FROM BinaryEg1 ORDER BY b;
-- Creating a table of 10 binary bytes to test how sorting works
CREATE TABLE BinaryEg10(
b BINARY(10)
);
-- Inserting values into 10 byte binary column
INSERT INTO BinaryEg10 VALUES (HEX('A'));
-- Adding some numbers of varying lengths to test sort order
INSERT INTO BinaryEg10 VALUES
(110),
(44),
(999999),
(1111111111),
(7876);
SELECT * FROM BinaryEg10 ORDER BY b;
Теперь я вижу порядок сортировки:
Объясните, пожалуйста, как работает сортировка, кажется, что первый байт самый важный в последовательности, остальные байты он игнорирует,
Я понимаю, что это может быть неуместным и бессмысленным вопросом, поскольку обычно я предполагаю, что не должен использовать двоичный файл для хранения символов, но я все же хотел бы получить четкое представление о том, как работает этот тип данных.
Привет, спасибо за это, я сделал шестнадцатеричный, вычислил значения, затем вставил некоторые базовые значения, и они точно сопоставляются с символами ASCII и Unicode.
Благодаря комментарию выше в моем вопросе у меня появилась идея получить шестнадцатеричное значение. Теперь у меня есть глубокое понимание того, как это работает.
Ответы:
Что такое числовое значение байта? Это то же самое, что и символ ASCII, получающий число? Если нет, то как определяется числовое значение?
Каждый байт в последовательности байтов, каждый байт представляет собой число от 0 до 255 с основанием 10, потому что каждый байт имеет 8 бит.
Когда я добавляю символ ASCII, его числовое значение сопоставляется с его шестнадцатеричным числовым кодом, который сопоставляется с его десятичным числовым кодом. Так что да, в случае символов ASCII числовой код и числовые значения идентичны.
Если я вставлю символ «А» в двоичный тип данных, как он будет закодирован и сохранен? В клиенте Table plus я не вижу, чтобы это сохранялось в двоичном виде.
Если я вставлю символ «A» в двоичный столбец, он займет 1 байт памяти, так же, как если бы я добавил символ «A» в столбец char.
Он будет закодирован в двоичный код на основе его десятичного/шестнадцатеричного значения из кодировки Latin1, которая является кодировкой по умолчанию для MariaDB. Это сопоставляется с таблицами ASCII и Unicode, так что это одно и то же.
Символ «A» имеет шестнадцатеричное значение: 41. При преобразовании в двоичный формат он будет сохранен как: 0100 0001, и это займет байт памяти. Десятичное значение — 65. При сравнении этого символа с другим значением в другой строке сравнение будет основано на этом числовом значении, а не на сопоставлении, как это было бы с символами.
В тот же тип данных я мог бы добавить символы, а также двоичное изображение, например, как определяется числовое значение строки байтов?
Важно понимать и осмысливать двоичный тип данных как ПОСЛЕДОВАТЕЛЬНОСТЬ БАЙТОВ. И каждый байт имеет числовое значение от 0 до 255.
Сравнение сравнивает числовое значение каждого байта слева направо. Если байты равны, то он сравнивает значение байта со следующим набором байтов и так далее.
Вот несколько примеров, которые показывают это:
-- Creating a table with just 1 byte
CREATE TABLE BinaryEg1(
b BINARY
);
-- Inserting values:
INSERT INTO BinaryEg1 VALUES (0), (1), ('A'), ('B'), ('a'), ('b'), (0);
Теперь я создал два столбца, один с обычным значением, а другой с шестнадцатеричным значением, и мы можем видеть, что числовые значения складываются с числовыми кодами, найденными в наборах символов ASCII, Latin1, UTF8:
SELECT b, HEX(b) FROM BinaryEg1 ORDER BY b;
Я создаю еще один пример с тремя столбцами, чтобы показать ту же точку, и мы можем увидеть, как столбцы сортируются таким же образом:
CREATE TABLE BinaryEg3(
b BINARY(3)
);
INSERT INTO BinaryEg3 VALUES
(418), (518), (318);
(320), (319), (317);
Теперь вы можете видеть обычные десятичные числа, а также их шестнадцатеричные значения, и я могу понять, как они будут отсортированы:
SELECT b, HEX(b) FROM BinaryEg3 ORDER BY b;
Теперь эти значения хранятся в двоичном формате на основе этих шестнадцатеричных чисел. Каждый байт имеет 2 шестнадцатеричных цифры, поэтому 3 цифры имеют 6 шестнадцатеричных цифр.
Каждый байт сравнивается на основе этого числового значения, поэтому 317 стоит перед 318, а 318 — перед 319.
Поскольку шестнадцатеричное/двоичное значение 3 и 1 одинаково, но 7 < 8 < 9
Посмотрите на
SELECT HEX(b) FROM BinaryEg10
, чтобы увидеть шестнадцатеричное представление значений в таблице. Это хранящиеся значения байтов, где 2 шестнадцатеричных цифры представляют значение байта.