首页 > 解决方案 > Mysql select from mediumint(8) to unique Binary(2)

问题描述

我正在尝试创建一个查询以将一个表中的唯一数据填充到另一个表的一部分中。我选择的源表中的两行是 mediumint(8) 和 varchar(20) 类型。在目标表中,我尝试从源表中填充一个 Binary(2) 和一个 varchar(20)。我也只选择前 100 个唯一值。

我遇到的问题是 mediumint(8) 到 Binary(2) 的转换。我可以看到我所有的 mediumint(8) 值都是唯一的,它们的数值都小于 200,但由于某种原因,我无法让它们适合 2 字节的唯一二进制列。我的查询一直拒绝插入,因为它说值大于 2 个字节。

示例查询:

select distinct id, part from partsTable
group by id
limit 100;

这回来了一个看起来有点像这样的表

 id| part
_________
1  |  A
2  |  B
3  |  C
21 |  AB
22 |  AC
...

我尝试过执行(id & 0xFFFF)之类的操作来强制我的 id 列为 2 个字节,以及 CAST(id 为 UNSIGNED)或 CAST(id 为 BINARY(2)),但这些总是截断数据,以便我得到重复值. 当我尝试将它们转换为二进制时,不确定我缺少什么或我能看到的唯一 id 值是如何全部转换为非唯一值的。

更令人困惑的是,作为一个测试,我刚刚在我的目标表中插入了两条记录:

INSERT into table1 (id, part) VALUES (0xFFFF, 'A');
INSERT into table1 (id, part) VALUES (0xFFFE, 'B');

然后我只写了一个查询来查看这些数据的样子:

SELECT bin(id) as id, hex(id) as hex, part FROM table1;

它返回如下结果:

id  | hex   | part
__________________
0   | 0xFFFF| A
0   | 0xFFFE| B

所以我不知道发生了什么

标签: mysql

解决方案


2 个字节将是 65535 的数字范围。这里的问题是 MySQL 中的二进制数据类型仍然包含一个字符串,而不是一个数字,但是使用二进制排序而不是像 char 数据类型那样的 utf8。不同之处在于二进制数据类型根据字节数而不是它存储的字符串中的字符数来限制值。换句话说,一个 3 位数的值(例如 150 作为字符串)将是 3 个字符,总共 3 个字节。因此,如果将此值转换为 BINARY(2),它将丢失超过其第 2 个字节的任何内容,使其变为 15。

因为它存储一个字符串,所以二进制数据类型并不像您所期望的那样仅限于数字字符 (0,1)。因此,您可以BINARY(2)使用HEX(). HEX(150)将是“96”,因此适合BINARY(2). 然后,您将不得不使用UNHEX()来检索这些值中的任何一个。如果该表中已经存储了其他值,我怀疑这对您是否有用。


推荐阅读