【问题标题】:SQL Query return match for id 3 with where = 3XW3Z1zD6JEV1600164577 [duplicate]id 3 的 SQL 查询返回匹配,其中 = 3XW3Z1zD6JEV1600164577 [重复]
【发布时间】:2021-10-28 13:02:55
【问题描述】:

我有这个问题

SELECT u0_.id AS id_0, u0_.uid AS uid_1, u0_.username AS username_2
FROM user u0_
WHERE u0_.uid = '3XW3Z1zD6JEV1600164577' OR u0_.id = '3XW3Z1zD6JEV1600164577';

返回两个结果:

ID 为 3 的用户

uid 为 3XW3Z1zD6JEV1600164577 的用户

我尝试使用 sequel pro 进行确认,但仍然得到错误的结果:

如果我像这样XW3Z1zD6JEV1600164577 从uid 中删除第一个3,我将无法匹配。那为什么表现得像LIKE ??

【问题讨论】:

  • 我猜是u0_.id = '3XW3Z1zD6JEV1600164577' 将右侧转换为整数 3。这是哪个数据库?如果 ID 是整数列,你想用它来实现什么?
  • 是mariaDB;我正在尝试根据传递的数据将用户与其 ID 或 UID 匹配

标签: sql mariadb


【解决方案1】:

您正在将数字与字符串进行比较,在这种情况下 MySQL 会将两个操作数都转换为浮点数:

例如,字符串和数字操作数的比较发生 作为浮点数的比较。

MySQL 在将字符串转换为数字时也很宽容:

SELECT CAST('3X' AS FLOAT) -- 3
SELECT CAST('X3' AS FLOAT) -- 0

这解释了为什么它匹配id = 3。所以要么不比较不同的数据类型,要么将整数转换为字符串以获得预期的结果:

WHERE u0_.uid = '3XW3Z1zD6JEV1600164577'
OR    CAST(u0_.id AS CHAR) = '3XW3Z1zD6JEV1600164577'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多