• 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

  • 相关阅读:
    收集邮票
    CF235B Let's Play Osu!
    [SHOI2002]百事世界杯之旅
    路径统计
    fastText 训练和使用
    由最多N个给定数字集组成的数字 Numbers At Most N Given Digit Set
    动态规划-划分数组的最大和 Split Array Largest Sum
    子序列宽度求和 Sum of Subsequence Widths
    Contest 158
    Bert
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12869579.html
Copyright © 2020-2023  润新知