MySQL案例-varchar的大小写字符比较

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: -------------------------------------------------------------------------------------------------正文-----------------------------------...
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------

背景:
程序某日提出的SQL问题, 发现比较varchar字符串内容的时候, 大小写不敏感;
测试环境还原问题, 环境构造如下:

点击(此处)折叠或打开

  1. create table case_sen(id int primary key, name varchar(32) not null);
  2. insert into case_sen values(1,'LucyLoveLily');
  3. insert into case_sen values(2,'lucylovelily');
  4. insert into case_sen values(3,'TomHateLarry');
  5. insert into case_sen values(4,'tomhatelarry');

效果如下:


实际上程序希望只有id=1的 匹配到,  
同样的问题也出现在like里面:


程序有问是不是 lower_case_table_names的问题, 显然......... 不是 _(:з」∠)_

场景:
MySQL-5.7进行的还原, 实际上这个问题 和版本没有关系;


分析:
首先可以确认的是, 表内的数据并没有问题, 该大写的还是大写, 该小写的还是小写;

那么问题最有可能出在MySQL的运算符"="和like上, 这两类运算的原理可能因为某些原因/设置/ 导致不进行 大小写区分;

排查 方向定下来以后, 试着用关键字comparison, case sensitive在文档里面找找, 发现有一个章节提到了这个问题,并给出了一些示例 ;
PS: 章节名   B.5.4.1 Case Sensitivity in String Searches

文档示例如图:


文档的描述进行归纳:  非binary类型的string进行逻辑运算时, 会依据collate的配置来计算结果;

所以如果collate的设置对大小写不敏感, 那么就会出现测试环境中的效果;

那么问题来了, utf8mb4的默认collate是什么?


发现是utf8mb4_general_ci, 通过对文档内容的分析这个后缀ci代表的意思应该就是case-
insensitive ;

那么试着换一下字符集的collate, 看看是不是能区分大小写;


Bingo~~~

当然, 在列上面指定collate为utf8mb4_bin也可以达到一样的目的;

PS: mysql的所有字符集默认都
使用XXX_general_ci, 而有的字符集会有XXX_general_cs, 但是utf8是没有的, 所以要使用utf8_bin;

PPS: 兴趣阅读: https://www.percona.com/live/europe-amsterdam-2015/sites/default/files/slides/PL_AMS_Unicode_Booking169_v3.pdf

PPPPPPPS: 注意索引哟, 5.7是可以的, <5.7可没有试过 ╰(*°▽°*)╯
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
22 1
|
2月前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
23 2
|
23天前
|
SQL 关系型数据库 MySQL
mysql 大小写、sql_mode
mysql 大小写、sql_mode
|
2月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
16 1
|
20小时前
|
SQL 数据可视化 关系型数据库
【MySQL-11】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
【MySQL-11】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
|
20小时前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
21小时前
|
关系型数据库 MySQL 数据库
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
|
21小时前
|
关系型数据库 MySQL Linux
【MySQL-9】一文带你搞定 外键约束&其【更新/删除行为】(可cv代码&案例演示)
【MySQL-9】一文带你搞定 外键约束&其【更新/删除行为】(可cv代码&案例演示)
|
21小时前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-案例练习-DQL基本介绍&语法&执行顺序(代码演示)
【MySQL】DQL-案例练习-DQL基本介绍&语法&执行顺序(代码演示)
|
21小时前
|
SQL 关系型数据库 MySQL
【MySQL-8】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)
【MySQL-8】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)