V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Weixk
V2EX  ›  数据库

请教, MySQL 数据库,使用非纯数字字符串作为自增主键的查询条件时遇到的问题。

  •  
  •   Weixk · 2019-12-07 21:36:37 +08:00 · 2518 次点击
    这是一个创建于 1811 天前的主题,其中的信息可能已经有所发展或是发生改变。

    MySQL 数据库版本 5.6
    数据库表 A 有自增主键 id 和 name 字段,由于历史原因,从前台传过来的字符串会先用来执行 SQL1:
    select * from A where name = 'str'
    如果查不到数据再执行 SQL2:
    select * from A where id = 'str'
    本来,这个 str 要么是非数字字串要么是纯数字字串。但是后来扩展业务时,这个 str 取的是用户设置的值,例如用户输入的是'123Test'。
    SQL1 查不出来,执行 SQL2 时,发现数据库会将 str 的数字部分截出来作为条件查,即变成
    select * from A where id = '123'

    我其实是想知道数据库是不是故意这样设计的,还是说只是单纯没想到开发者会这样使用 SQL。

    6 条回复    2019-12-20 11:08:05 +08:00
    gowa
        1
    gowa  
       2019-12-07 21:39:31 +08:00 via Android
    哥子 你想说什么。自增主键 id 不是字符类型啊。

    不做显式转换的时候 给你隐式转换了啊
    Weixk
        2
    Weixk  
    OP
       2019-12-07 21:48:02 +08:00
    @gowa 即使是进行类型转换,'123Test'这种数据不应该是转不了数字直接报类型错误吗。变成 123 去查能查出数据,对我们业务来说就是 Bug 了。我就是这点感到奇怪。
    gowa
        3
    gowa  
       2019-12-07 21:54:59 +08:00   ❤️ 2
    SELECT 1='123x' FROM dual;

    你试试这句 SQL 就明白了。。然后,参考文档: https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html

    > In all other cases, the arguments are compared as floating-point (real) numbers. For example, a comparison of string and numeric operands takes places as a comparison of floating-point numbers.
    wangyzj
        4
    wangyzj  
       2019-12-07 22:08:03 +08:00
    你们业务逻辑很有趣
    chengyiqun
        5
    chengyiqun  
       2019-12-08 18:34:47 +08:00
    隐式转换会自动截断...这个没辙, 如果一开始代码里就使用 DTO 作为入参查询, 可以避免这个问题
    065535
        6
    065535  
       2019-12-20 11:08:05 +08:00
    分两条 SQL 去查询,在逻辑上是不严谨的。先不说隐式转换的问题,当前的业务逻辑需要修改为一条 sql 在数据上才是一致的严谨的:select * from A where name = 'str' or id = 'str'

    然后我们再说隐式转换在 mysql 的设计:When an operator is used with operands of different types, type conversion occurs to make the operands compatible.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1051 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:30 · PVG 03:30 · LAX 11:30 · JFK 14:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.