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

标签 mysql string hex

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

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

对于上面存储过程中的 View ,“Column1”是一个十六进制值。 “pId”是网页调用传入的字符串值。为了更清楚,“pId”是 Column1 的文本表示。但是,当在上面的存储过程中使用时,结果是返回零行(它应该至少返回 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 中生成的“十六进制”值的“字符串”表示形式发送。希望澄清过程。

最佳答案

编辑:

在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)

关于MySQL 如何将 HEX 类型的列与表示十六进制值的字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805637/

相关文章:

mysql - 在 WordPress 自定义 SELECT 查询中使用 MIN

string - 从 NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys 获取 [String]

java - 为唯一的字符串种子生成唯一的 Long

php - 使用mysql在php中检索和上传图像

mysql - 如何成功地将 InnoDB 表复制到另一个 Linux 安装?

c++ - 使用 strlen 时不为空终止符添加 +1 会导致在使用 send 时发送额外的垃圾字节

java - 用字节数组表示一个数(java编程)

java - 如何将十六进制字符串转换为普通字符串?

matlab - 将十六进制转换为单精度

php - 如何将每个选中的复选框添加到 MySQL 中的单行