Mysql大小写敏感问题
前言
Mysql有如下三个大小写敏感相关问题。
- 数据库名与表名
- 列名和列的别外
- 字段内容
数据库名与表名大小写敏感?
windows
默认情况,数据库名与表名是不区分大小写。
若想修改为大小写敏感,如下配置:
- 打开C:\ProgramData\MySQL\MySQL Server 5.7目录,找到my.ini文件并打开。
- 在结尾处添加如下代码
#区分大小写
lower_case_table_names=2
有人说如下设置lower_case_table_names=0 这样会报错。
可参数MySQL配置文件-my.ini理解my.ini文件
- 重启mysql服务
net stop MySQL57;
net start MySQL57;
- 验证,执行sql语句
show global variables like '%lower_case%';
ps
把lower_case_table_names从0改变为1
在你把lower_case_table_names设置为1时,在restart你的mysqld之前,请把数据库名和表名更改为小写
linux
默认情况,数据库名与表名是严格区分大小写。
若想修改为大小写敏感,如下配置:
- 打开 /etc/my.cnf,添加如下lower_case_table_names = 1 //大小写不敏感
- 设置好后重启服务:systemctl restart mysqld
- 验证
show variables like "%case%";
列名大小写敏感?
windows和linux默认情况,列名与列的别名在所有的情况下均是忽略大小写的;
字段内容大小写敏感?
这个很重要,不然会闹出笑话的。
windows
默认情况,字段内容大小写不敏感。
若想修改为大小写敏感,如下配置:
方法一
在创建表时指定字段的校验规则,使用BINARY
,比如create table aa (a varchar(20) BINARY
, c varchar(20)) ;
或者(推荐)
DROP TABLE IF EXISTS `aa`;
CREATE TABLE `aa` (
`a` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`c` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
方法二
表已经创建,执行修改sql语句
alter table test3 modify name varchar(20) collate utf8_bin;,其实本质上也是把collatioin(校对)模式改成二进制校对,实现大小写敏感。
方法三(推荐)
使用Navicat for MySQL工具,打开设计表,选中字段,在下面的排序规则里选中utf8-bin
方法四
不修改mysql,修改查询语句
指定Collation:select * from case1 where B like ‘%b%’ collate utf8_bin;
通过binary把字符串转化为二进制比较:select * from case1 where binary B like ‘%b%’;
原理:
字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则 .
一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束 。比如 utf8字符集,utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的校对规则;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。
总结:只要在创建表的时候指定collate为utf8_bin,就可以实现大小写敏感,如果建表时未指定,则可修改字段的校对规则,也可以实现大小写敏感。
linux
默认情况,字段内容大小写不敏感。
若想修改为大小写敏感,设置方法如上windows
总结
windows
1、数据库名与表名是忽略大小写;
2、表的别名是忽略大小写;
3、列名与列的别名是忽略大小写;
4、字段内容默认情况下是严格区分大小写。
linux
1、数据库名与表名是严格区分大小写;
2、表的别名是严格区分大小写;
3、列名与列的别名是忽略大小写;
4、字段内容是忽略大小写。