• 数据库执行语句时,严重注意类型转换的问题


      这次上线遇到一个bug,导致回滚。定位到问题,发现是sql执行时一个语句坑了。

    简单说下,就以update语句为例。

    创建一个表:

    CREATE TABLE `test_01` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'auto incr id',
      `a_id` varchar(50) NOT NULL DEFAULT ' ' COMMENT 'aid',
      `a_name` varchar(50) NOT NULL DEFAULT ' ' COMMENT 'aname',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='test表'

    插入几条数据:

    insert into test_01(a_id,a_name) values('a1','n1'),('a2','n2'),('a3','n3');

    ok,类型转换时的坑来了。

    update test_01 set a_name='nn' where a_id=0;

    更新的where条件是a_id=0,那么表里会发生更新么?

    答案就是所有的行的a_name都更新为了'nn'。

    为什么会发生这样的问题?因为表结构中设计的a_id是varchar类型,而更新语句中where条件的a_id是数字0。

    这时就发生了类型转换的问题。mysql会把表里a_id列下所有行都转化为数字,去跟你告诉mysql的0进行比较。发现表里的a_id下转化为数字时,都转化成为了0。那么所有记录取出来就对了。

    所以,在sql拼写时,一定要严格按照类型搞。

    比如这个更新语句就应该写成:

    update test_01 set a_name='nn' where a_id='0';// 加个引号
  • 相关阅读:
    app版本升级的测试点
    APP测试完整测试用例设计方法
    多条件组合查询---测试用例设计
    上传文件和导出的测试用例设计
    需求评审时,测试应该做什么?
    什么是PRD?
    什么是测试计划?
    由谁来编写测试计划?
    测试计划模板
    无法预览图片
  • 原文地址:https://www.cnblogs.com/firstForEver/p/5802675.html
Copyright © 2020-2023  润新知