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

arn*_*nep 4 mysql type-conversion sqldatatypes

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

SELECT * FROM users WHERE id = '$x' OR username = '$x'
Run Code Online (Sandbox Code Playgroud)

这是工作给予用户名的时候一样foo,bar123或像IDS 1,123.但是,当我提供类似的用户名时2foo,选择用户2foo和用户id=2.因此,需要对22foo,发现一个用户.另外我收到一条警告消息:1292:截断错误的DOUBLE值:2foo.

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

Eug*_*eck 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'";
Run Code Online (Sandbox Code Playgroud)

应该有所帮助

这是SQL版本,只是为了完整性:

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

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