使MySQL不要将字符串转换为数字

时间:2012-01-09 15:31:31

标签: mysql sqldatatypes type-conversion

我的应用程序中有一个查询,它通过ID或用户名从表中选择用户:

SELECT * FROM users WHERE id = '$x' OR username = '$x'

当给定foobar123等用户名或1123等ID时,此功能正常工作。 但是当我提供2foo这样的用户名时,它会同时选择用户2foo和用户id=2。因此它需要2 2foo并找到一个用户。另外,我收到一条警告消息: 1292:截断错误的DOUBLE值:2foo

有没有办法告诉MySQL不要进行此转换(对于此查询而不是整个数据库)?或者我是否需要在查询后进行过滤以丢弃错误结果?

1 个答案:

答案 0 :(得分:5)

您的查询是以某种方式形成的,它会在MySQL中触发“这是一个特征而不是错误”的行为:您将相同的字符串('$ x')与数字字段(id)进行比较)和varchar字段(用户名)。

虽然我确信,有一些方法可以在SQL中使用它,我怀疑唯一正确的方法是修复创建查询的PHP。像

这样的东西
if (is_numeric($x)) $sql="SELECT * FROM users WHERE id = '$x' OR username = '$x'";
else $sql="SELECT * FROM users WHERE username = '$x'";

应该有帮助。

以下是SQL版本,仅为了完整性:

SELECT * FROM users WHERE id = IF('$x' REGEXP '^[0-9]+$','$x',0) OR username = '$x'

注意:形成我假设的OQ,$ x已经被转义。