MySQL 如何将 HEX 类型的列与表示十六进制值的字符串进行比较

MySQL how to compare a HEX type column to a string representing a hex value

我有一个数据库视图,其中有一列从 bigint 转换为 hex。我还有以下存储过程:

CREATE PROCEDURE giveMeRows(pId varchar(64))
   BEGIN
     select * viewRowGiver Where Column1 = pId
   END

对于上面存储过程中的视图,"Column1"是一个十六进制值。 "pId"是网页调用传入的字符串值。为了更清楚,"pId" 是 Column1 的文本表示。但是,当在上面的存储过程中使用时,结果是零行 returned(它应该 return 至少 1)

我猜测将 HEX 与 String 进行比较不是可行的方法。

这样比较不行:

Column1 = HEX(pId)

当基础表中有数百行时,这样的比较会花费相当长的时间(超过 20 秒):

CONV(Column2, 16, 10) = CONV(pId, 16, 10)

有什么想法可以解决这个问题,让它在不花费太多时间的情况下工作吗?

编辑以显示带有示例数据的整个过程:

**BASE TABLE** 
CREATE TABLE `BaseTable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `DevID` bigint(20) unsigned DEFAULT NULL,
  `Nickname` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniqueOne` (`DevID`,`ArrayIndex`)
) ENGINE=InnoDB AUTO_INCREMENT=196742 DEFAULT CHARSET=latin1;

Produces this kind of data
1355742314703884    Item 1
1090982514412804    Item 2
1100905476801632    Item 3
819808395279156     Item 4
947267619541158     Item 5
978328868008274     Item 6
45394831601695870   Item 7

**VIEW (this view is also called to get all rows to be displayed on a website)**
CREATE VIEW viewFromBaseTable
  SELECT HEX(DevID) as Column1, Nickname FROM BaseTable

Produces this kind of data
4D10A5B132C0C   Item 1
3E03E293A4D04   Item 2
3E94487E04460   Item 3
2E99C842F3B34   Item 4
35D88EDF850A6   Item 5
379C8F0A6B152    Item 6
A1465BDC41FC7E   Item 7

**STORED PROCEDURE(the where clause here works, albeit slower than it should)**
CREATE PROCEDURE procGetRowsById(pId varchar(64))
  BEGIN
    SELECT * FROM viewFromBaseTable WHERE CONV(Column1, 16, 10) = CONV(pId, 16, 1)
  END

调用存储过程的网站代码 "procGetRowsById" 将 pId 作为 viewFromBaseTable 中生成的 "hex" 值的 "string" 表示形式发送。希望澄清过程。

编辑:

在BaseTable上做,直接用bigint比较。

delimiter //
CREATE PROCEDURE procGetRowsById(pId varchar(64))
  BEGIN
    SELECT HEX(DevID) as Column1, Nickname FROM BaseTable WHERE DevID = CONV(pId, 16, 10);
  END
//
delimiter ;

mysql> call procGetRowsById('4D10A5B132C0C');
+---------------+------------+
| Column1       | Nickname   |
+---------------+------------+
| 4D10A5B132C0C | DaNickName |
+---------------+------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)