Сопоставление двоичных типов данных с символами в MariaDB

Я пытаюсь получить глубокое представление о СУБД, я изучаю MariaDB.

Пытаюсь получить тип данных Binary и то, как работает его сопоставление.

Я понимаю, что тип данных binary(n) занимает n байт. Это означает, что наименьшая память, которая может быть выделена, составляет 1 байт?

Это взято из документации MariaDB:

Тип BINARY подобен типу CHAR, но хранит двоичные строки байтов, а не недвоичные строки символов. M представляет длину столбца в байтах. Он не содержит набора символов, а сравнение и сортировка основаны на числовом значении байтов.

У меня есть следующие подвопросы:

  1. Что такое числовое значение байта? Это то же самое, что и символ ASCII, получающий число? Если нет, то как определяется числовое значение?
  2. Если я вставлю символ «А» в двоичный тип данных, как он будет закодирован и сохранен? В клиенте Table plus я не вижу, чтобы это сохранялось в двоичном виде.
  3. В тот же тип данных я мог бы добавить символы, а также двоичное изображение, например, как определяется числовое значение строки байтов?

Я создал несколько таблиц, чтобы проверить это,

Сначала я создаю таблицу, чтобы проверить это с помощью 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;

Теперь я вижу порядок сортировки:

Объясните, пожалуйста, как работает сортировка, кажется, что первый байт самый важный в последовательности, остальные байты он игнорирует,

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

Посмотрите на SELECT HEX(b) FROM BinaryEg10, чтобы увидеть шестнадцатеричное представление значений в таблице. Это хранящиеся значения байтов, где 2 шестнадцатеричных цифры представляют значение байта.

danblack 04.04.2023 01:37

Привет, спасибо за это, я сделал шестнадцатеричный, вычислил значения, затем вставил некоторые базовые значения, и они точно сопоставляются с символами ASCII и Unicode.

theMyth 04.04.2023 09:16
Алгоритм сортировки слиянием (с кодом на Python, Java, JavaScript, PHP, C++)
Алгоритм сортировки слиянием (с кодом на Python, Java, JavaScript, PHP, C++)
Merge sort - самый популярный алгоритм сортировки, основанный на принципе алгоритма "разделяй и властвуй".
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря комментарию выше в моем вопросе у меня появилась идея получить шестнадцатеричное значение. Теперь у меня есть глубокое понимание того, как это работает.

Ответы:

Что такое числовое значение байта? Это то же самое, что и символ 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

Другие вопросы по теме