00 简单回顾
之前写过一篇关于mysql 对表大小写敏感的问题,其实在mysql中字段存储的内容是不区分大小写的,本篇进行简单的总结。
想回顾一下:
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名与表名是严格区分大小写的;
2、表的别名是严格区分大小写的;
3、列名与列的别名在所有的情况下均是忽略大小写的;
4、字段内容默认情况下是大小写不敏感的。
01 一个例子
简单例子:
CREATE TABLE tb_user
(id
BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id',username
VARCHAR (50) NOT NULL COMMENT '用户名',
PRIMARY KEY (id
)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户表';
INSERT INTO u2s
.tb_user
(id
, username
) VALUES ('1', 'user');
INSERT INTO u2s
.tb_user
(id
, username
) VALUES ('2', 'User');
INSERT INTO u2s
.tb_user
(id
, username
) VALUES ('3', 'USER');
使用 查询语句查询 username 为 全部小写的user 的用户,结果查询出这个三条记录全部都查询到了。
mysql> SELECT username from tb_user where username = 'user'; |
---|
username |
user |
User |
USER |
3 rows in set
通过这个例子简单说明,字段内容默认情况下是大小写不敏感的。
02 解决方案
因为默认情况下字段内容是不区分大小写的,也即大小写不敏感。所以解决方案就是要新增字段内容的校验规则。
使用mysql 的BINARY 关键字使搜索区分大小写。
在查询的sql中加入BINARY 关键字
mysql> select * from tb_user where BINARY username ='user'; | |
---|---|
id | username |
1 | user |
1 row in set
这种方式相对较简单,不用改动表结构,只需在需要区分查询的字段前加上手机号购买关键字。这种方式也是有缺点的,每次写查询的时候都要注意加关键字,并可能需要改动的代码较多。
在创建表的时候进行限制
CREATE TABLE tb_user1
(id
BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id',username
VARCHAR (50) BINARY NOT NULL COMMENT '用户名',
PRIMARY KEY (id
)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户表';
mysql> show create table tb_user1;
tb_user1 | CREATE TABLE tb_user1
(id
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',username
varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用户名',
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'
1 row in set
或者 使用
CREATE TABLE tb_user2
(id
BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id',username
VARCHAR (50) NOT NULL COMMENT '用户名',info
VARCHAR (100) NOT NULL COMMENT '详情描述',
PRIMARY KEY (id
)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COLLATE=utf8_bin COMMENT = '用户表';
mysql> show create table tb_user2;
tb_user2 | CREATE TABLE tb_user2
(id
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',username
varchar(50) COLLATE utf8_bin NOT NULL COMMENT '用户名',info
varchar(100) COLLATE utf8_bin NOT NULL COMMENT '详情描述',
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表'
使用 NGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin会将字段中varchar类型的全部设置区分大小写。这两种查看表的详情,本质上都是 在字段上 加上了 COLLATE utf8_bin。
03 总结
字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则。 一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以ci(大小写不敏感)、cs(大小写敏感)或_bin(二元)结束 。
比如 utf8字符集,,如下表:
1)utf8bin:utf8bin将字符串中的每一个字符用二进制数据存储,区分大小写。
2)utf8generalci:utf8generaci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
3)utf8generalcs:utf8generalcs区分大小写,cs为case sensitive的缩写,即大小写敏感。
注:我本机使用5.7 版本不支持 utf8generalcs 字符集,创建报错。