MySQL疑04---对数据库中存储数据大小写不敏感问题

一、问题描述

当写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的缩写,即大小写敏感。

参考

https://www.cnblogs.com/aflyun/p/11047737.html

原文地址:https://www.cnblogs.com/zhubincheng/p/12869579.html