MySql 二进制查询

标签 mysql sql binary

我有一张带有二进制 PK 的表:

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 字段可以是任意长度。

最佳答案

而不是 Binary数据类型,你应该使用 Varbinary .这不会用尾随 0 填充数据,以防数据长度小于定义的最大大小。

When BINARY values are stored, they are right-padded with the pad value to the specified length. The pad value is 0x00 (the zero byte). Values are right-padded with 0x00 on insert, and no trailing bytes are removed on select.

For VARBINARY, there is no padding on insert and no bytes are stripped on select.

此外,您不需要在已定义的主键上定义唯一约束。 Primary Key基本满足Unique约束,附加条件NOT NULL值。因此,进一步定义 Unique 约束不会在其上添加任何内容。

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] |

View on DB Fiddle

关于MySql 二进制查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53246046/

相关文章:

mysql - 返回对用户配置文件的最近访问。 Group-by-N 混淆

sql - 如何过滤偶数和奇数并将它们移动/复制到空列?

java - SQLite 如果数据库中存在输入则跳过或覆盖现有的

C++二进制输出问题

mysql - 执行查询结果语句

php - 为什么我不应该在 PHP 中使用 mysql_* 函数?

php - 在 PHP 中添加额外代码后,If 语句未运行

python - 在 python 中添加二进制数需要帮助

php - 在 PHP 中反转二叉树

php - 教程网站的数据库结构