请教, MySQL 数据库,使用非纯数字字符串作为自增主键的查询条件时遇到的问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Weixk
V2EX    数据库

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

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

    MySQL 数据库版本 5.6
    数据库表 A 有自增主键 id 和 name 字段,由于历史原因,从前台传过来的字符串会先用来执行 SQL1:
    select * from A where name = 'str'
    如果查不到数据再执行 SQL2:
    seect * 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
    你们业务逻辑很有趣
    C02TobNClov1Dz56
        5
    C02TobNClov1Dz56  
       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     Solana     5119 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:28 PVG 17:28 LAX 02:28 JFK 05:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86