zoukankan      html  css  js  c++  java
  • mysql 隐式转换问题(案例一)

     建表语句:

    CREATE TABLE `user` (
      `id` varchar(255) NOT NULL,
      `username` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

      表中数据:

     

     

    引入问题:

      执行sql语句

      

    SELECT id FROM `user` where id = 204027026112927605
    

      结果按照预期的话应该是只有id等于204027026112927605 的一条数据,实际输出的结果为:

      

     分析:这里再where后面的条件查询处发生了隐式转换

    逐行读取user表的id列放入val1,而常量204027026112927603存在于cache中,类型为double类型(2.0402702611292762E+17),所以到这里传值给val2后val2=2.0402702611292762E+17。

     

     

    当扫描到第一行时,204027026112927605转成doule的值为2.0402702611292762e17,等式成立,判定为符合条件的行,继续往下扫描,同理204027026112927603也同样符合

    解决方法:(类型保持一致,避免出现隐式转换)


    因为在定义表时id的类型为varchar类型,所以我们在条件处吧需要搜索的条件也赋成字符串类型,就可以避免隐式转换。

    正确的sql:(用单引号讲id的值引起来)

    SELECT id FROM `user` where id = '204027026112927605'
    

      查询的结果:

      

    结论:

    1. 避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in参数包含多个类型、字符集类型或校对规则不一致等
    2. 隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别
    3. 数字类型的建议在字段定义时就定义为int或者bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致

     

     

     原文参考自知乎作者: 程序员引路人

  • 相关阅读:
    【转】苹果App Store审核指南中文翻译(更新)
    ios中的coredata的使用
    iOS开发——网络编程OC篇&Socket编程
    [深入浅出Cocoa]iOS网络编程之Socket
    RESTful架构详解
    IOS开发 REST请求 ASIHTTPRequest用法
    iOS 8 AutoLayout与Size Class自悟
    nodejs入门demo
    微信公众号查询账户余额等
    微信公众号token验证失败的一些总结
  • 原文地址:https://www.cnblogs.com/vegetableDD/p/12546528.html
Copyright © 2011-2022 走看看