这篇文章主要介绍了MySQL中存储的数据查询的时候怎么区分大小写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中存储的数据查询的时候怎么区分大小写文章都会有所收获,下面我们一起来看看吧.
这一点与其它流行的数据库都不相同.
MySQL 允许在查询的时候指定以大小写敏感方式,需要使用关键字 BINARY,查询如下:
SELECT?*?FROM?student?WHERE?BINARY?name?=?'ZhangSan'; --或者 SELECT?*?FROM?student?WHERE?name?=?BINARY?'ZhangSan';
很多时候当发现 MySQL 数据库存在上述问题时,系统已经运行了一段时间,如果采用方法二或方法三的代价可能会很大.
使用此方法最大的好处便是可以快速实现功能.
但是这个方法也存在很大的限制:如此可能因为无法使用索引导致查询性能下降.
原因很好理解,因为此时针对查询字段的索引也是按照大小写不敏感方式建立的.
除非数据量不大,或者在你的应用中不在乎这点性能上的损失,那么只能选择方法二或方法三了.
在创建表时指定具体的字段大小写敏感,示例如下:
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 开发的可能会比较眼熟,因为其中的选项中已经给出了答案:
很多 COLLATE 都带有 _ci 字样,这是 Case Insensitive 的缩写,即大小写无关,也就是说 "A" 和 "a" 在排序和比较的时候是一视同仁的.selection * from table1 where field1="a" 同样可以把 field1 为 "A" 的值选出来.与此同时,对于那些 _cs 后缀的 COLLATE,则是 Case Sensitive,即大小写敏感的.
库.
实例级别.
实例级别的 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中存储的数据查询的时候怎么区分大小写相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!