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)
我有一个数据库视图,其中有一列从 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)