MySql Бинарный запрос - PullRequest
       5

MySql Бинарный запрос

0 голосов
/ 11 ноября 2018

У меня есть таблица с двоичным ПК:

CREATE TABLE `codes` (
   `Code` binary(45) NOT NULL,

   PRIMARY KEY (`Code`),
   UNIQUE KEY `Code_UNIQUE` (`Code`)

 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Когда я вставляю, я использую BINARY('value').

Я попытался получить строку с помощью Code, используя следующее:

SELECT * from codes WHERE `Code` = BINARY('value')

Это не работает, потому что длина поля Code равна 45, поэтому MySql дополняет данные пустыми байтами.

Это можно визуализировать, выполнив следующее:

SELECT HEX(Code), HEX(BINARY('value')) FROM codes 

enter image description here

Я могу заставить его работать с этим (безобразным) запросом:

SELECT * FROM codes WHERE TRIM('0' from HEX(Code)) = HEX(BINARY('value'))

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

1 Ответ

0 голосов
/ 11 ноября 2018

Вместо Binary типа данных, вы должны использовать Varbinary. Это не будет дополнять данные конечными нулями, если длина данных меньше определенного максимального размера.

Когда значения BINARY сохранены, они добавляются справа с помощью пэда значение до указанной длины. Значение пэда составляет 0x00 (нулевой байт). Значения дополняются справа до 0x00 при вставке, а завершающие байты не удалено при выборе.

Для VARBINARY заполнение при вставке отсутствует, а байты не удаляются. на выбор.

Кроме того, вам не нужно определять уникальное ограничение для уже определенного первичного ключа. Первичный ключ в основном удовлетворял ограничению Unique с дополнительным условием NOT NULL значений. Таким образом, дальнейшее определение уникального ограничения ничего не добавляет к нему.

Вот как может выглядеть выражение CREATE TABLE:

CREATE TABLE `codes` (
   `Code` Varbinary(45) NOT NULL, -- Changed to Varbinary

   PRIMARY KEY (`Code`) -- Removed Unique constraint

 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into codes (Code) VALUES (BINARY('value'));

Запрос № 1

SELECT HEX(Code), HEX(BINARY('value')) FROM codes ;

| HEX(Code)  | HEX(BINARY('value')) |
| ---------- | -------------------- |
| 76616C7565 | 76616C7565           |

Запрос № 2

SELECT * from codes WHERE `Code` = BINARY('value');

| Code            |
| --------------- |
| [object Object] |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...