一、问题描述
当写python用户登录与注册功能,连接数据库时发现,当用户名不同时,也会显示用户已存在。
这是因为当数据库中,数据默认不区分大小写。那我们在账号密码这种识别的状态下,是需要区分大小写的,我们该怎么做呢?
二、解决方案
2.1 BINARY关键字
因为默认情况下字段内容是不区分大小写的,也即大小写不敏感。所以解决方案就是要新增字段内容的校验规则。
使用mysql 的 BINARY 关键字使搜索区分大小写。
在查询的sql中加入 BINARY 关键字
如上述代码中:可以将查询sql语句改写,加入BINARY关键字
check_sql = 'select name from user where BINARY name =%s ' # 加入BINARY关键字,可使查询结果区分大小写
check_sql = 'select name from user where name =%s ' # 这种查询无法区分大小写
2.2 建表时就进行限制
collate:核对,校勘,对照(不同来源的信息); 整理(文件或书等);
此处即改为以二进制来校核,可区分大小写
mysql> create table t3(
id int primary key auto_increment comment'用户id',
user varchar(50) BINARY not null comment'用户名'
)engine=innodb charset =utf8 comment='用户表';
Query OK, 0 rows affected (0.04 sec)
mysql> create table t5(
id int primary key auto_increment comment'用户id',
user varchar(50) not null comment'用户名'
)engine=innodb default charset =utf8 collate=utf8_bin comment='用户表';
总结:这两种查看表的详情,本质上都是 在字段上 加上了 COLLATE utf8_bin。
总结:
字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则。 一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以ci(大小写不敏感)、cs(大小写敏感)或_bin(二元)结束 。
比如 utf8字符集,,如下表:
1)utf8bin:utf8bin将字符串中的每一个字符用二进制数据存储,区分大小写。
2)utf8generalci:utf8generaci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
3)utf8generalcs:utf8generalcs区分大小写,cs为case sensitive的缩写,即大小写敏感。