遇到一个很奇怪的问题,在数据库中搜索字符串“123”会将“123”以及“123_”【注:_表示空格】的数据都搜索出来,真是令人头大。

1、背景

品牌名校验,对新增的品牌名进行长度校验,历史数据不进行校验

select * from brand where brandName in (……);

某个品牌名是历史数据,如"123456789_",【下划线表示是一个空格】但是前端传值时,将品牌名的尾部空格进行了去除,为"123456789",执行SQL语句时,MySQL会将搜索出"123456789_"的品牌名,但是进行比对的时候,就没有品牌名和"123456789"相同,所以认为该品牌名是新增数据,需要进行长度校验,校验长度为8,不通过,报错。

2、场景复现

2.1 数据准备

新建表格

CREATE TABLE `t` ( `id` int(11) NOT NULL, `keyValue` varchar(255) NOT NULL, `extValue` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `ix_value` (`keyValue`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

插入数据

CREATE DEFINER=`root`@`localhost` PROCEDURE `idata`()begin declare i int; set i=1; while(i<=1000000)do insert into t(id,keyvalue) values(i,i); set i=i+1; end while;end

修改数据

update t set keyValue='109089 ' where id=109089;

2.2 场景复现

尾部带空格与不带空格的查询结果

3、查阅资料

官方手册说明(5.0版本):

11.1.6.1. The CHAR and VARCHAR Types

All MySQL collations are of type PADSPACE. This means that all CHAR, VARCHAR, and TEXT values in MySQL are compared without regard to any trailing spaces. "Comparison" in this context does not include the pattern-matching operator, for which trailing spaces are significant.

所有MySQL归类均为PADSPACE类型。 这意味着将比较MySQL中的所有CHAR,VARCHAR和TEXT值,而不考虑任何尾随空格。 在本文中,"比较"不包括LIKE模式匹配运算符,对于后者,尾随空格很重要。

4.解决方案

4.1 技术解决方案

4.1.1 like

采用like语句进行解决

4.1.2 BINARY

采用BINARY进行解决

4.1.3 length()函数

采用length()函数进行解决

4.2 业务解决方案

上述的解决方案只能解决单条数据查询的场景,对于select in类型的查询还是没有找到比较好的解决方案,因此提出几点建议:

  1. 对于数据定义的问题:定义结尾带空格与不带空格的数据等价;即查询品牌名是否存在时,将品牌名尾部带空格和不带空格的品牌名视作同一品牌名,如“abc_”与“abc”视作同一品牌名;
  2. 对于数据的录入,去除尾部空格;
  3. 对于数据比对:如批量比对数据是否存在,将取出的结果集数据取出尾部空格,同时将待比对的数据去除尾部空格进行比对。

Web 搜索的概念

mysql去除空格的函数_MySQL字符串尾部空格匹配的问题相关推荐

  1. R语言str_extract函数从字符串中抽取匹配模式的字符串

    R语言str_extract函数从字符串中抽取匹配模式的字符串 目录 R语言str_extract函数从字符串中抽取匹配模式的字符串 #导入包和库

  2. python去掉字符串尾部空格的函数_python清除字符串前后空格函数的方法

    python清除字符串前后空格函数的方法 python有时候需要清除字符串前后空格,而字符本身的空格不需要清除掉,那就不能用正则re.sub来实现. 这时用到strip()函数 用法: str = ' ...

  3. php 去除字符前空格,php中删除字符串前导空格的函数是什么?

    函数是:Ltrim().ltrim()函数的作用是从字符串左侧删除空格或其他预定义字符:其语法为"ltrim(string,charlist)":参数string表示要转换的字符串 ...

  4. mysql信息函数和加密函数_MYSQL 常用函数(数学、字符串、日期时间、系统信息、加密)...

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...

  5. mysql中字符串拼接函数_MySQL 字符串连接CONCAT()函数

    MySQL字符串连接函数 使用方法: CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制字符 ...

  6. python中去除字符串中首尾空格的函数_Python字符串的首尾空格如何去掉?

    Python程序设计中,会用到很多字符串,字符串中可能包含空格.而空格看不见摸得着,因此空格可能会带来很多意想不到的错误,那么字符串的空格如何去掉? 今天我们就来学习,利用函数去掉字符串里的空格. 空 ...

  7. js去掉前后空格的函数_MySQL 中常见的字符串函数应用详解

    在前面若干章节中,我们介绍了SQL的基础与高阶语法,接下来,我们将分四个章节,介绍MySQL中常见的函数应用,大致分为如下几个章节: MySQL 字符串函数 MySQL 数字函数 MySQL 日期函数 ...

  8. mysql strcmp s1 s2_MySQL函数基础——字符串函数详解

    昨天,咱们对MySQL的数学函数进行了讲解,今天,咱们再来解析MySQL字符串函数. 字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数.字符串合并函数.字符串替 ...

  9. mysql常用日期时间函数_MySql常用日期时间函数

    返回当前的日期和时间 select MICROSECOND(SYSDATE()); --0 select SECOND(SYSDATE()); --33 select MINUTE(SYSDATE() ...

最新文章

  1. 印度首次挑战登月告败,一步之遥≈多大差距?
  2. windows2003+PHP-5.3.8+IIS6.0的安装配置
  3. python求最大素数_Python实现求最大公约数及判断素数的方法
  4. Linux系统下部署Tomcat
  5. 富文本_轻量级 web 富文本编辑器 —— wangEditor
  6. eclipse+spket+Extjs4.2.1开发环境搭建
  7. 使用bat执行java项目
  8. vb.net word 自定义工具栏_word重点标记新玩法:应用绘图工具手写笔进行划线涂抹...
  9. bootstrap-table 加表格线 样式换成table-bordered
  10. java需要最大正数_Java输出double类型中的最小正数和最大正数
  11. 如何本地修改dns服务器,如何更新本地DNS?
  12. 2个步骤,让人才成为组织进化的发动机
  13. Linux通过windows代理上网并安装软件
  14. 之前的账号不见了,@21cn.com的。哪里可以找的回来?
  15. 超时空智慧办公白皮书(2023)
  16. 使用码云同步谷歌 Chrome 浏览器书签
  17. server取出多个最小值 sql_sql-server
  18. Dynamodb 备份策略
  19. 关于js阻止冒泡时的一些坑
  20. android+酷炫动画效果,Android简单酷炫点击动画(附源码)

热门文章

  1. filezilla 设置服务器_树莓派 LAMP服务器搭建
  2. 如何用Python的pyecharts库绘制K线图
  3. Eclipse 不为人所知的另一面 - 企业管理软件领域 ABAP 编程语言开发利器
  4. SAP Commerce Cloud SmartEdit 的安装
  5. 使用 SAP Fiori Tools 部署 SAP UI5 应用到 ABAP 服务器时遇到的各种错误和解决办法
  6. Travis CI 配置文件 .travis.yml 的语法介绍和一些用法举例
  7. SAP 电商云 Spartacus UI 3.4.5 版本引入的对并发 SSR 请求的支持
  8. Visual Studio Code 里针对 SAP Commerce Cloud Impex 文件的语法高亮扩展
  9. SAP Analytics Cloud和Cloud for Customer之间的Single Sign on配置
  10. SAP ui5 ABAP repository handler class的 get_webcontent方法