首页 > 数据库 >测试杂谈——一条SQL引发的思考(二)

测试杂谈——一条SQL引发的思考(二)

时间:2022-10-18 07:22:04浏览次数:81  
标签:San Zhang 杂谈 12345678 报错 思考 SQL test

在前段时间,曾写过一篇关于SQL问题的文章,测试杂谈——一条SQL引发的思考(一)

今天这篇,算是个问题记录吧,问题并不复杂,但对于测试同学而言,确实是个需要关注的点。

问题分析

最近在日常工作中,又遇到一个报错,日志中的具体报错如下:

res=500  en****  Server  Error,error trace StatementCallback; bad SQL grammar [UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE 'test San'Zhang|%' and id = '12345678']; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Zhang|%' and id = '12345678'' at line 1

将报错核心点提取,就是个SQL报错,来看具体SQL,如下所示:

UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE 'test San'Zhang|%' and id = '12345678';

看到这里,对于SQL基本功扎实的朋友,应该已经看出问题所在了。

看到这个问题后,分别找了研发和测试同学。找研发是让排查问题的根因,为啥能存进这样的数据;找测试是想考察下,SQL的基本功(带领的测试同学我没面过)。

得到的结果,还真有点震惊到我了,只能说“同志还需努力呀!!!!!”

好了,回到正题上来吧。这个SQL如日志里的报错,就是个语法问题:bad SQL grammar。但到底是哪里有问题呢?

就是like语句这里 h LIKE 'test San'Zhang|%' , test San'Zhang 中的单引号没有转义成功,导致在完整的SQL语句中,后半部分被截断,最终整个SQL报错。

这个只是SQL层面的问题,但根因是啥,还得研发同学解决。

解决方案

转义

最好的处理方式,就是在代码层面上,将英文的单引号做转义处理,这样就可以避免掉这种报错了

SQL如下:

UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE 'test San’Zhang|%' and id = '12345678';

条件值用英文双引号

另外一种方式,就是将like条件值用英文双引号,这样就避免了被截断的问题

SQL如下:

UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE "test San'Zhang|%" and id = '12345678';

好了,以上就是今天的内容了。分析这个问题并不复杂,从中也有些感触,基本功还是需要扎实,一起努力吧。

标签:San,Zhang,杂谈,12345678,报错,思考,SQL,test
From: https://www.cnblogs.com/hong-fithing/p/16751067.html

相关文章

  • 常用PostgreSQL函数
    工作中用到的函数做一下记录加深影响。to_number用法:to_number(text1,text2)text1:需要转换的字符串text2:格式化模板,如模式9,代表一个数位......
  • MYsql中BufferPool缓存机制
    1.当修改一条数据时,会将数据从磁盘文件中读入到缓存中,2.然后将此版本记录到undolog日志文件中生成版本链,便于回滚3.更新bufferpool中的数据4.将缓存的数据记录到redolog......
  • docker部署nacos配置mysql
    version:"3"services:mysql:restart:alwaysimage:mysql:latestcontainer_name:cloud_mysql......
  • springboot连接mysql报错errorCode 0, state 08S01
    前言许久未维护的项目需要检查一些数据,重新运行项目发现有createconnectionSQLException,具体报错信息是errorCode0,state08S01。SpringBoot版本2.5,MySQL8.0报......
  • SQL的简介
    什么是SQL?1.SQL是结构化查询语言2.SQL是一种ANSI的标准计算机语言(ANSI是一种字符代码,与之相关的还有ASCll,Unicode)3.SQL是用于访问和处理数据库的标准的计算机语言那么,SQL能......
  • mysql数据同步
    介绍如果在多个服务器上部署了系统,这时候可能就会用到数据库的同步。主服务器修改mysql的配置文件(my.conf或者my.ini):server-id=1log-bin=/var/log/mysql/logbin/mysql-binb......
  • MySQL的基本命令
    1.查看所有的数据库showdatabases();2.打开指定库use+库名;3.查看当前库的所有表showtables;4.查看其它库的所有表showtablesform+库名;5.创建一个......
  • linux安装mysql
    清理环境centos7会自带一个mariadb查看是否已安装rpm-qa|grep-imysqlrpm-qa|grep-imariadb(centos7默认系统自带的)mysql会和mariadb冲突删除mariadbrpm-em......
  • ySQL的下载和安装(msi
    使用msi安装的优点:在使用zip手动安装后,隔一段时间MySQL服务会自动关闭,需要再次手动重启MySQL服务。而使用msi安装程序会避免这个问题,但安装过程有点繁琐。msi官网下载步......
  • java第30天sql基础
    MYSQL1.sql语句(1)sql语句:结构化查询语言-->写一段只能被数据库识别的语句,可以对数据库中的数据进行增删改查操作(2)sql语句的组成:DML:数据操作语言-->数据库中的......