mysql如何查询是否大小写敏感_MySQL查询大小写是否敏感问题分析
mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则(SQL Server里叫排序规则)的设置决定的,通常默认是不支持的大小写字母敏感的。
SQL Server直接只显示排序规则,不显示字符集,因为每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci,存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束,选了排序规则就相当于选了字符集
1. 什么是字符集和校验规则?
字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。任何一个给定的字符集至少有一个校对规则,它可能有几个校对规则。要想列出一个字符集的校对规则,使用SHOW COLLATION语句。
校对规则一般有这些特征:
两个不同的字符集不能有相同的校对规则。
每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci。
存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。
2. 不同级别的字符集和校验规则可控制大小写敏感
MySQL5.1在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合定义字符串。字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级、连接级。
2.1服务器级
MySQL按照如下方法确定服务器字符集和服务器校对规则:
(1)修改配置文件/etc/my.cnf
在[mysqld]下添加:collation_server = utf8_bin
重启实例
更改服务器级的校验规则(collation_server )后,数据库校验规则(collation_collation)默认会继承服务器级的。
注意:
这个只适用于在重新启动之后, 新建的库,已存在的库不受影响.
同样的, 即使库的校验规则改了,已经存在的表不受修改影响;
同理与已经存在的列…
mysql> create database yutest0;
Query OK, 1 row affected (0.00 sec)
mysql> use yutest0;
Database changed
mysql> create table t1 (name varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values('AAA');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values('aaa');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------+
| name |
+------+
| AAA |
| aaa |
+------+
2 rows in set (0.00 sec)
mysql> select * from t1 where name='aaa';
+------+
| name |
+------+
| aaa |
+------+
1 row in set (0.00 sec)
可以看出,在服务器级进行相应的校对规则设置,查询大小写敏感。
(2)当服务器启动时根据有效的选项设置
当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和校对规则。
shell> mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci
2.2数据库级
MySQL这样选择数据库字符集和数据库校对规则:
如果指定了character set X和collate Y,那么采用字符集X和校对规则Y。
如果指定了character set X而没有指定collate Y,那么采用character set X和character set X的默认校对规则。
否则,采用服务器字符集和服务器校对规则。
(1)修改配置文件/etc/my.cnf
进行了两组测试:
1) 在[mysqld]下添加:
collation_server = utf8_bin
collation_database = utf8_bin
2) 在[mysqld]下添加:
collation_database = utf8_bin
重启实例,两组都不能正常启动,错误信息如下:
可见,my.cnf配置文件中不支持设置collation_database 变量。
(2)创建数据库时设置数据库校验规则
mysql> create database yutest default character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_bin |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| abc |
+------+
2 rows in set (0.00 sec)
mysql> select * from t1 where name='abc';
+------+
| name |
+------+
| abc |
+------+
1 row in set (0.01 sec)
可以看出,在数据库级进行相应的校对规则设置,查询大小写敏感。
2.3表级
MySQL按照下面的方式选择表字符集和校对规则:
如果指定了character set X和collate Y,那么采用character set X和collate Y。
如果指定了character set X而没有指定collate Y,那么采用character set X和character set X的默认校对规则。
否则,采用数据库字符集和服务器校对规则。
在创建表时设置表级校验规则:
mysql> create database yutest2;
Query OK, 1 row affected (0.01 sec)
mysql> use yutest2;
Database changed
mysql> create table t1(name varchar(10))
-> default character set utf8 collate utf8_bin;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values('ABC');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values('abc');
Query OK, 1 row affected (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| abc |
+------+
2 rows in set (0.00 sec)
mysql> select * from t1 where name='abc';
+------+
| name |
+------+
| abc |
+------+
1 row in set (0.00 sec)
可以看出,在表级进行相应的校对规则设置,查询大小写敏感。
2.4 连接级
考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和校对规则的问题,这些问题均能够通过系统变量来解决:
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。
服务器接收到查询后应该转换为哪种字符集?
转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection。
服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
3. 创建数据库表时大小写不敏感,仍然有方法在查询时区分大小写
3.1在SQL语句中使用collate
使用collate子句,能够为一个比较覆盖任何默认校对规则。collate可以用于多种SQL语句中,比如where,having,group by,order by,as,聚合函数。
mysql> select * from t1 where name collate utf8_bin = 'ABC';
+------+
| name |
+------+
| ABC |
+------+
1 row in set (0.00 sec)
mysql> select * from t1 where name = 'ABC';
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)
3.2binary操作符
binary操作符是collate子句的一个速记符。binary ’x‘等价与’x‘ collate y,这里y是字符集’x‘二元校对规则的名字。每一个字符集有一个二元校对规则。例如,latin1字符集的二元校对规则是latin1_bin,因此,如果列a是字符集latin1,以下两个语句有相同效果:
select * from t1 order by binary a;
select * from t1 order by a collate latin1_bin;
mysql> select * from t1 where binary name = 'ABC';
+------+
| name |
+------+
| ABC |
+------+
1 row in set (0.00 sec)
mysql>
mysql> select * from t1 where name = 'ABC';
+------+
| name |
+------+
| ABC |
| Abc |
| abc |
+------+
3 rows in set (0.00 sec)
参考链接:
mysql如何查询是否大小写敏感_MySQL查询大小写是否敏感问题分析相关推荐
- mysql数据库表名大小写敏感_Mysql数据库名和表名的大小写敏感性问题
导读:一直以来,Mysql数据库名和表名的大小写都是个敏感的问题,困扰着Mysql数据库管理员.在 MySQL 中,数据库和表对应于那些目录下的目录和文件.因而,操作系统的敏感性决定数据库和表命名的大 ...
- mysql查询解析过程_MySQL查询执行过程详解
查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...
- mysql 事务 查询 范围加锁_MySQL死锁系列-常见加锁场景分析
本文我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题. 如下图所示,数据库的隔离等级,SQL 语句和当前数据库 ...
- mysql查询数据教程_MySQL 查询数据
sql 语句的关联查询 左关联: left join ... on ... 右关联: right join... on ... 格式: select 字段 from 表1 left join 表2 o ...
- MySQL查询的方法_MYSQL 查询方法
mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据 select Code,Name from Info --查指定列的数据 select Code ...
- mysql怎么查找列命令_MySQL查询命令-DQL
MySQL查询命令-DQL EMP //员工表 员工编号 员工名 岗位 领导 入职日期 工资 奖金 部门编号 +-------+--------+-----------+------+-------- ...
- mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)
MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存. 你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫. 这篇和上一篇都是干货,我也是第一次学. ...
- mysql 查询缓存设置_MySQL查询缓存设置 提高MySQL查询性能
从 MySQL4开始,出现了QueryCache查询缓存,如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询.这样就大大提 ...
- mysql函数循环查询的数据_MySQL 查询树结构、循环查询、查看函数、视图、存储过程...
MySQL经常会用到查询树结构数据,这里专门收集整了一篇. 构建函数 构建树查询函数:查询父级节点函数 --在mysql中完成节点下的所有节点或节点上的所有父节点的查询--根据传入id查询所有父节点的 ...
最新文章
- asp.net[web.config] httphandlers 与实现自由定义访问地址
- PowerShell图形化编程1-原理
- BitMap 原理代码记录
- 谷歌又有手机黑科技:进入办公室就变静音,遇车祸自动报警
- 大数据时代企业如何保障数据安全?这款工具值得一看
- 地表地形对地下温度及地表热流的影响
- 用fileupload处理文件上传
- unity中程序的延时
- r语言 转录本结构及丰度_生信人的R语言视频教程语法篇第三章:数行天下(4)R中的数据——从结构角度划分(数组)...
- ChIP-Seq,MeRIP-seq峰(peak),eccDNA等染色体分布可视化
- 云电脑有显卡吗?云电脑怎么做画面处理?
- 一款 Windows 上的万能工具 Wox
- word文档编辑受限制怎么解除?
- jquery选择器可以利用后代和直系后代选择器连续选择元素
- 人工智能机器人技术概述
- 抖音是如何做内容推荐的?
- 特斯拉看位置说服务器错误,特斯拉App惊现大面积宕机!车主集体发飙,官方处理太弱智了...
- 华为云CDN加速服务:让你体验不一样的云提速
- sinon.js的spy、stub和mock
- APP测试与WEB测试的区别