zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
    计量经济学 第四版 课后答案 李子奈 潘文卿 版 课后 练习题答案 高等教育出版社 课后习题答案
    统计学 第四版 课后题答案 袁卫 庞皓 贾俊平 杨灿 版 思考与练习题 课后答案 案例分析 答案与解析
    golang逃逸分析
    通过实例理解Java网络IO模型
    带你逆袭kafka之路
    解决2020-3-27 github无法访问
    图床
    Python彩蛋--zen of python
    python3内置函数大全
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12869579.html
Copyright © 2011-2022 走看看