前段时间在工作中测试提出了一个BUG,让我把根据ID查询区分大小写的功能去掉,大小写都随便查,然后我在SQL的位置加上了UPPER(id) = UPPER(#{id})的写法,而同事知道这个问题后的反映是"MySQL查询不是本就不区分大小写吗",后来我找机会简单了解了一下才明白,MySQL区分大小写取决于数据库的排序规则,今天在这里记录一下

一般创建数据库都会使用utf8编码,对应两种常用的排序规则就是utf8_binutf8_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查询关于区分字母大小写问题的更多相关文章

  1. MySQL中查询时对字母大小写的区分

    我相信很多人在mysql中查询时都遇到过mysql不区分字母大小写的情况:如以下例子: 1.SELECT * FROM `user` WHERE userpass = 'Z20'; 结果为: 2.SE ...

  2. 关于mysql 查询内容不区分大小问题

    问题描述: select * from users where user_name ='user_01' 跟 select * from users where user_name ='uSer_01 ...

  3. [Go语言]从Docker源码学习Go——init()方法和identifier首字母大小写区分

    init()方法 如果想在一个go文件里,进行一些初始化的工作,可以把代码放到init()方法中. init()方法先被执行. func init() { // initialization of p ...

  4. MySQl查询区分大小写的解决办法

    通过查询资料发现需要设置collate(校对) . collate规则: *_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 *_cs: ca ...

  5. mysql查询中通配符的使用

    mysql查询中通配符的使用     在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: “_” ...

  6. MySql查询不区分大小写解决方案(两种)

    当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查 ...

  7. mysql查询不区分大小写问题分析和解决

    mysql查询默认是不区分大小写的 如: select * from some_table where str=‘abc'; select * from some_table where str='A ...

  8. MYSQL查询语句大全集锦

    MYSQL查询语句大全集锦 1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATA mysql> C ...

  9. MySQL查询不区分大小写的sql写法

    MySQL查询不区分大小写的sql写法 mysql查询默认是不区分大小写的 如: select * from some_table where str=‘abc'; select * from som ...

  10. 转!!mysql 查询条件不区分大小写问题

    做用户登录模块时,输入用户名(大/小写)和密码 ,mysql都能查出来.-- mysql查询不区分大小写. 转自 http://blog.csdn.net/qishuo_java/article/de ...

随机推荐

  1. 基于MaxCompute+开放搜索的电商、零售行业搜索开发实践

    ​简介: 搜索一直是电商行业流量来源的核心入口之一,如何搭建电商行业搜索并提升搜索效果,一直是电商行业开发者努力攻克的难题.基于传统数据库或开源引擎虽然能够搭建基础搜索服务,但随着商品数据的增多和业务 ...

  2. [PHP] 如何让 php-fpm 的循环 echo 实时输出到浏览器

      PHP 里开启实时输出方法是 ob_implicit_flush() , 但它大部分情况下都不管用, 因为 php.ini 配置里 output_buffering 输出缓冲大部分是 On 开启的 ...

  3. 🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦

    大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 近期尝试了下 OpenTiny 的 CLI 工具,不得不说 ...

  4. dockerfile构建镜像常用命令

    一.什么是dockerfile Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. docke ...

  5. 实验2 C语言分支与循环基础应用编程 王刚202383310053

    1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define N 5 5 int ma ...

  6. 前端如何操作动态渲染的多个checkbox列表单选

    input[type=checkbox]:after{     content:"";     display:inline-block;     width:16px;      ...

  7. 使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV

    前言 吐槽:由于科研任务,需要在云端运行一个基于神经网络的目标识别库,需要用到GPU加速.亚马逊有很多自带GPU的机器,但是环境的配置可折腾坏了,尤其是opencv,每次总会出各种各样的问题! 无奈中 ...

  8. gitignore文件不生效的问题解决

    如何添加 git的忽略文件 .gitignore 在使用git过程中,我们可能有些文件不需要上传上去,比如一些缓存文件,生成的图片,运行环境的一些配置等等,这时就需要用到.gitignore忽略掉这些 ...

  9. JavaScript算法---基础排序类

    <html> <script> //正序排序,把大的放到最后,arr[j]>arr[j+1] let fz=(arr)=>{ for(let len=arr.len ...

  10. 关于DDD和COLA的一些总结和思考

    写在前面: 其实之前一直想汇总一篇关于自己对于面向对象的思考以及实践的文章,但是苦于自己的"墨迹",一延再延,最近机缘巧合下仔细了解了一下COLA的内容,这个想法再次被勾起,所以这 ...