Login
网站首页 > 文章中心 > 其它

MySQL中存储的数据查询的时候怎么区分大小写

作者:小编 更新时间:2023-10-23 07:35:50 浏览量:202人看过

这篇文章主要介绍了MySQL中存储的数据查询的时候怎么区分大小写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中存储的数据查询的时候怎么区分大小写文章都会有所收获,下面我们一起来看看吧.

MySQL中存储的数据查询的时候怎么区分大小写-图1

场景描述

这一点与其它流行的数据库都不相同.

解决办法

MySQL 允许在查询的时候指定以大小写敏感方式,需要使用关键字 BINARY,查询如下:

SELECT?*?FROM?student?WHERE?BINARY?name?=?'ZhangSan';
--或者
SELECT?*?FROM?student?WHERE?name?=?BINARY?'ZhangSan';

很多时候当发现 MySQL 数据库存在上述问题时,系统已经运行了一段时间,如果采用方法二或方法三的代价可能会很大.

使用此方法最大的好处便是可以快速实现功能.

但是这个方法也存在很大的限制:如此可能因为无法使用索引导致查询性能下降.

原因很好理解,因为此时针对查询字段的索引也是按照大小写不敏感方式建立的.

除非数据量不大,或者在你的应用中不在乎这点性能上的损失,那么只能选择方法二或方法三了.

MySQL中存储的数据查询的时候怎么区分大小写-图2

在创建表时指定具体的字段大小写敏感,示例如下:

CREATE?TABLE?student?(
?...
?name?VARCHAR(64)?BINARY?NOT?NULL,
?...

)

关键字 BINARY 指定 name 字段大小写敏感.

如此在查询时就算不使用 BINARY 关键字,查询语句也是大小写敏感的.

在此基础上创建的 name 相关的索引也是大小写敏感的,也就能够使用索引来提高性能.

MySQL 允许在大多数字符串类型上使用 BINARY 关键字,用于指明所有针对该字段的运算是大小写敏感的,更多信息请参见 MySQL 官方文档.

这种方法使得设计者可以精确地控制每个字段是否大小写敏感.不过在很多系统的设计中,期望大部分甚至所有的字段统一大小写敏感.MySQL 也提供了解决方案,这就要用到方法三.

在 MySQL 中执行 show create table 指令,可以看到一张表的建表语句,example 如下:

CREATE?TABLE?+table1+?(
?+id+?bigint(20)?unsigned?NOT?NULL?AUTO_INCREMENT,
?+field1+?text?COLLATE?utf8_general_ci?NOT?NULL?COMMENT?'字段1',
?+field2+?varchar(128)?COLLATE?utf8_general_ci?NOT?NULL?DEFAULT?''?COMMENT?'字段2',
?PRIMARY?KEY?(+id+)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8_unicode_ci;

使用 Navicat 开发的可能会比较眼熟,因为其中的选项中已经给出了答案:

MySQL中存储的数据查询的时候怎么区分大小写

很多 COLLATE 都带有 _ci 字样,这是 Case Insensitive 的缩写,即大小写无关,也就是说 "A" 和 "a" 在排序和比较的时候是一视同仁的.selection * from table1 where field1="a" 同样可以把 field1 为 "A" 的值选出来.与此同时,对于那些 _cs 后缀的 COLLATE,则是 Case Sensitive,即大小写敏感的.

MySQL中存储的数据查询的时候怎么区分大小写

库.

实例级别.

实例级别的 COLLATE 设置就是 MySQL 配置文件或启动指令中的 collation_connection 系统变量.

库级别设置 COLLATE 的语句如下:

CREATE?DATABASE??DEFAULT?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci;

表级别的 COLLATE 设置,则是在 CREATE TABLE 的时候加上相关设置语句,例如:

CREATE?TABLE?table_name?(
......
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_unicode_ci?COMMENT?=?'表注释';

如果表级别没有设置 CHARSET 和 COLLATE,则表级别会继承库级别的 CHARSET 与 COLLATE.

列级别的设置,则在 CREATE TABLE 中声明列的时候指定,例如

CREATE?TABLE?(
+field1+?VARCHAR(64)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_general_ci?NOT?NULL?DEFAULT?''?COMMENT?'字段1',
......
)?......

如果列级别没有设置 CHARSET 和 COLATE,则列级别会继承表级别的 CHARSET 与 COLLATE.

最后,你也可以在写 SQL 查询的时候显示声明 COLLATE 来覆盖任何库表列的 COLLATE 设置,不太常用,了解即可:

SELECT?DISTINCT?field1?COLLATE?utf8mb4_general_ci?FROM?table1;

SELECT?field1,?field2?FROM?table1?ORDER?BY?field1?COLLATE?utf8mb4_unicode_ci;

实例级别设置.

也就是说列上所指定的 COLLATE可以覆盖表上指定的 COLLATE,表上指定的 COLLATE 可以覆盖库级别的 COLLATE.如果没有指定,则继承下一级的设置.

即列上面没有指定 COLLATE,则该列的 COLLATE 和表上设置的一样.

以上就是土嘎嘎小编为大家整理的MySQL中存储的数据查询的时候怎么区分大小写相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章