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)utf8_bin:utf8_bin将字符串中的每个字符用二进制数据存储,辨别大小写。
2)utf8_general_ci:utf8_genera_ci不辨别大小写,ci为case insensitive的缩写,即大小写不敏感。
3)utf8_general_cs:utf8_general_cs辨别大小写,cs为case sensitive的缩写,即大小写敏感。
注:我本机运用5.7 版本不支持 utf8_general_cs 字符集,建立报错。
经由过程上一篇和这一篇的内容,细致人人对mysql对大小写敏感的题目也有肯定的认识了,在现实的开辟中,库和表名最好运用小写字母,注重字段存储内容的大写题目。而且让当地开辟环境mysql的设置和服务器上mysql的设置保持一致,如许防备由于环境不一致而涌现一些诡异题目。
你在开辟中有没有碰到一些诡异的题目呢?迎接留言分享。
更多MySQL相干技术文章,请接见MySQL教程栏目举行进修!
以上就是MySQL存储的字段是不辨别大小写的,你知道吗?的细致内容,更多请关注ki4网别的相干文章!