MySQL查询关于区分字母大小写问题
前段时间在工作中测试提出了一个BUG,让我把根据ID查询区分大小写的功能去掉,大小写都随便查,然后我在SQL的位置加上了UPPER(id) = UPPER(#{id})的写法,而同事知道这个问题后的反映是"MySQL查询不是本就不区分大小写吗",后来我找机会简单了解了一下才明白,MySQL区分大小写取决于数据库的排序规则,今天在这里记录一下
一般创建数据库都会使用utf8编码,对应两种常用的排序规则就是utf8_bin和utf8_general_ci,其中utf8_bin就是区分大小的排序规则,另一个就是不区分大小写的排序规则,接下来针对排序规则进行一些简单的测试
注意:本人使用的Navicat客户端工具,其他客户端工具可能会对测试结果造成影响(例如SQLyog)
先测试区分大小写的排序规则
-- 创建区分大小写的数据库
CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
-- 选择数据库
USE test;
-- 创建一张测试表
CREATE TABLE aaa (
id VARCHAR(16),
PRIMARY KEY(id)
);
-- 插入测试数据
INSERT INTO aaa VALUES('abc');
-- 正常查询,可以查询到结果
SELECT id FROM aaa WHERE id = 'abc';
-- 修改大小写后,查询不到结果
SELECT id FROM aaa WHERE id = 'abC';
可以看出排序规则为bin的数据库使用查询是区分大小写的,然后再测试一下不区分大小写的
-- 创建不区分大小写的数据库
CREATE DATABASE test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 选择数据库
USE test2;
-- 创建一张测试表
CREATE TABLE aaa (
id VARCHAR(16),
PRIMARY KEY(id)
);
-- 插入测试数据
INSERT INTO aaa VALUES('abc');
-- 正常查询,可以查询到结果
SELECT id FROM aaa WHERE id = 'abc';
-- 修改大小写后同样可以查询到结果
SELECT id FROM aaa WHERE id = 'abC';
可以看出general_ci是不区分大小写的,有了结论后我们把test库修改为不区分大小写试试看
-- 将数据库的排序规则修改为utf8_general_ci
ALTER DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 选择test数据库
USE test;
-- 再次查询,还是查询不到结果
SELECT id FROM aaa WHERE id = 'abC';
这里已经把数据库的排序规则修改了,怎么还是查不到数据呢?原因是因为直接改库只对以后创建的表生效,并不会对已存在的表造成影响,这里新建一张表来测试一下
CREATE TABLE bbb (
id VARCHAR(16),
PRIMARY KEY(id)
);
INSERT INTO bbb VALUES('bbb');
SELECT id FROM bbb WHERE id = 'bBb';
果然,后续创建的表是不区分大小写的,接下来需要让已经创建的表也不区分大小写,这里直接修改表的排序规则试试
-- 将表的排序规则修改为utf8_general_ci
ALTER TABLE aaa DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 再次查询,还是查询不到结果
SELECT id FROM aaa WHERE id = 'abC';
修改表的排序规则不行,那就修改字段(列)的排序规则
-- 将字段的排序规则修改为utf8_general_ci
ALTER TABLE aaa MODIFY id VARCHAR(16) CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 再次查询,查询成功!
SELECT id FROM aaa WHERE id = 'abC';
通过测试我们可以知道,排序规则分别有三个生效的作用域,分别是 列、表、库,而他们之间生效的优先级为列 > 表 > 库,只要列的排序规则修改成功,表和库的排序规则对于列来说就不重要了
经过测试了解到如果想要某个字段不区分大小写查询,就执行如下SQL修改他的排序规则即可:
ALTER TABLE [表名] MODIFY [字段名] [字段类型] CHARACTER SET utf8 COLLATE utf8_general_ci;
如果表中有大批字段需要修改的话一个一个改很麻烦,可以调用这段SQL修改表以及表中所有字段
ALTER TABLE [表名] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
扩展
其实除了utf8_general_ci排序规则之外,utf8_unicode_ci同样不区分大小写,只不过unicode相对于general效率较低,但是查询精准度更高一些,详情点击这里(其实我也不懂)
MySQL查询关于区分字母大小写问题的更多相关文章
- MySQL中查询时对字母大小写的区分
我相信很多人在mysql中查询时都遇到过mysql不区分字母大小写的情况:如以下例子: 1.SELECT * FROM `user` WHERE userpass = 'Z20'; 结果为: 2.SE ...
- 关于mysql 查询内容不区分大小问题
问题描述: select * from users where user_name ='user_01' 跟 select * from users where user_name ='uSer_01 ...
- [Go语言]从Docker源码学习Go——init()方法和identifier首字母大小写区分
init()方法 如果想在一个go文件里,进行一些初始化的工作,可以把代码放到init()方法中. init()方法先被执行. func init() { // initialization of p ...
- MySQl查询区分大小写的解决办法
通过查询资料发现需要设置collate(校对) . collate规则: *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 *_cs: ca ...
- mysql查询中通配符的使用
mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: “_” ...
- MySql查询不区分大小写解决方案(两种)
当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查 ...
- mysql查询不区分大小写问题分析和解决
mysql查询默认是不区分大小写的 如: select * from some_table where str=‘abc'; select * from some_table where str='A ...
- MYSQL查询语句大全集锦
MYSQL查询语句大全集锦 1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATA mysql> C ...
- MySQL查询不区分大小写的sql写法
MySQL查询不区分大小写的sql写法 mysql查询默认是不区分大小写的 如: select * from some_table where str=‘abc'; select * from som ...
- 转!!mysql 查询条件不区分大小写问题
做用户登录模块时,输入用户名(大/小写)和密码 ,mysql都能查出来.-- mysql查询不区分大小写. 转自 http://blog.csdn.net/qishuo_java/article/de ...
随机推荐
- 如何用Netty写一个高性能的分布式服务框架?
简介: Netty 是一个致力于创建高性能网络应用程序的成熟的 IO 框架.相比较与直接使用底层的 Java IO API,不需要先成为网络专家就可以基于 Netty 去构建复杂的网络应用.业界常见的 ...
- Go 调用 Java 方案和性能优化分享
简介: 一个基于 Golang 编写的日志收集和清洗的应用需要支持一些基于 JVM 的算子. 作者 | 响风 来源 | 阿里技术公众号 一 背景 一个基于 Golang 编写的日志收集和清洗的应 ...
- 如何高效学习 Kubernetes 知识图谱?
简介: Kubernetes 知识图谱遵循云原生人才学习路径搭建课程体系框架,及人才发展路线设置不同阶段,由浅入深,帮助云原生人才学习容器基础.Kuternetes 网络.存储.资源对象.服务发现. ...
- 2019-9-27-微软的-P2P-下载方式
title author date CreateTime categories 微软的 P2P 下载方式 lindexi 2019-09-27 09:44:44 +0800 2019-09-27 09 ...
- Gradle8.4构建SpringBoot多模块项目
Gradle8.4构建SpringBoot多模块项目 一.基本 1.版本 这个版本是Jdk8最后一个SpringBoot版本 软件 版本 Gradle 8.4 SpringBoot 2.7.15 JD ...
- 『手撕Vue-CLI』添加自定义指令
前言 经上篇『手撕Vue-CLI』添加帮助和版本号的介绍之后,已经可以在控制台中输入 nue --help 来查看帮助信息了,但是在帮助信息中只有 --version,--help 这两个指令,而 v ...
- 微服务从代码到k8s部署应有尽有系列全集
微服务从代码到k8s部署应有尽有系列全集 https://mp.weixin.qq.com/s/8U2h85YJHy3H3hzlBakPPw 实战项目地址:https://github.com/Mik ...
- FTP主动模式和被动模式(2)
防火墙对FTP的影响 ASPF 多通道协议 应用层程序有些使用的是单通道协议,有些使用的是多通道协议. 单通道协议 例如http协议,整个协议交互过程中,服务端和客户端只建立一个连接,并且服务端固定使 ...
- jeecgboot项目swagger2在线接口转word
1.先找到接口文档地址 2.根据url获取接口数据 3.利用在线工具进行转换生成word 在线工具地址:在线swagger转word文档 生成的word文档如下:
- 前端使用 Konva 实现可视化设计器(11)- 对齐效果
这一章补充一个效果,在多选的情况下,对目标进行对齐.基于多选整体区域对齐的基础上,还支持基于其中一个节点进行对齐. 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 I ...