mysql unhex()不能在linux服务器上运行?

时间:2011-12-29 18:15:35

标签: php mysql linux

我使用以下代码将用户密码存储到mysql表中,密码列为BINARY(20)类型:

$salted_hash = sha1($salt . $password);
$sql = sprintf("INSERT INTO foo(user, password) VALUES ('guest', UNHEX('%s'))", $salted_hash);

匹配密码的选择查询如下所示:

$salted_hash = sha1($salt . $password);
$sql = sprintf("SELECT `userID` FROM `foo` WHERE `user`='guest' AND `password`=UNHEX('%s')", $salted_hash);

当我连接到在Windows或Mac机器上运行的Web服务器时,代码工作正常。但是,我的生产Web主机是一台Linux机器,而SELECT在那里失败了。

我只能phpMyAdmin到我的网站托管服务商(mhpMyAdmin版本3.4.7.1)。通过phpMyAdmin我执行以下查询:

SELECT UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104')

显示的结果与十六进制数3530280EDB5AA715929266D1D6F0423ABC27B104相同,这似乎表明UNHEX函数在linux上没有做任何事情。

如果我在Mac上Sequel Pro执行相同的查询,我会50(ÛZ§fÑÖðB:¼'±

我不确定发生了什么,在哪里看。我在想,phpMyAdmin无法显示二进制文件,或者UNHEX确实存在一些问题(似乎不同)。感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这似乎是一个可配置的设置:"Show binary contents as HEX"。我在同一台服务器上试过你的查询...

SELECT UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104')

...但使用两个不同的客户端。我可以确认phpMyAdmin以你找到的方式转义二进制输出。您可以使用以下方法仔细检查输出是否正确:

SELECT HEX(UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104'))='3530280EDB5AA715929266D1D6F0423ABC27B104'

...,应返回1,或使用简单的PHP脚本运行原始查询。总结一下:UNHEX()没有错。

我使用的大多数托管服务实际上允许外部MySQL客户端,您只需要在控制面板中启用它。确保情况并非如此。如果你能与Sequel Pro联系,那么使用愚蠢的网络客户端是愚蠢的。

我建议你用PHP代码进一步调试。我不清楚如何构建匹配的哈希(你在其他查询中检索盐吗?)。

答案 1 :(得分:0)

如果您正在阅读这篇文章,是因为上述解决方案都不适合您(对我而言)。

我已经通过使用存储过程解决了...

CREATE DEFINER=`root`@`%` PROCEDURE `SearchMessage`(IN code_to_search VARCHAR(255))
BEGIN
    SELECT * FROM tablename WHERE UPPER(UNHEX(SUBSTRING(hex_field,25))) like CONCAT('%',UPPER(TRIM(text_to_search)),'%') COLLATE latin1_swedish_ci;
END

希望有帮助。