zoukankan      html  css  js  c++  java
  • db mysql / mysql cluster 5.7.19 / my.cnf / lower_case_table_names

    s

    mysql大小写敏感配置
    show global variables like '%lower_case%';

    show global variables like '%lower_case%';

    <pre>
    +------------------------+-------+
    | Variable_name | Value |
    +------------------------+-------+
    | lower_case_file_system | ON |
    | lower_case_table_names | 0 |
    +------------------------+-------+
    </pre>

    lower_case_file_system

    表示当前系统文件是否大小写敏感,只读参数,无法修改。

    ON 大小写不敏感 
    OFF 大小写敏感 

    lower_case_table_names

    表示表名是否大小写敏感,可以修改。

    lower_case_table_names = 0时,mysql会根据表名直接操作,大小写敏感。 
    lower_case_table_names = 1时,mysql会先把表名转为小写,再执行操作。

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

    MySQL存储的字段是不区分大小写的,你知道吗? / 数据库不允许区分大小写,业务需要区分大小写,则解决方案:调优SQL大小入库写法。

    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)utf8bin:utf8bin将字符串中的每一个字符用二进制数据存储,区分大小写。

    2)utf8generalci:utf8generaci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。

    3)utf8generalcs:utf8generalcs区分大小写,cs为case sensitive的缩写,即大小写敏感。

    注:我本机使用5.7 版本不支持 utf8generalcs 字符集,创建报错。

    通过上一篇和这一篇的内容,详细大家对mysql对大小写敏感的问题也有一定的认识了,在实际的开发中,库和表名最好使用小写字母,注意字段存储内容的大写问题。并且让本地开发环境mysql的配置和服务器上mysql的配置保持一致,这样防止因为环境不一致而出现一些诡异问题。

    你在开发中有没有遇到一些诡异的问题呢?欢迎留言分享。

    04 参考资料

    https://dev.mysql.com/doc/search/?d=12&p=1&q=binary

    https://www.techonthenet.com/mysql/functions/binary.php

    https://www.cnblogs.com/wzmenjoy/p/4244545.html

    end

  • 相关阅读:
    设计模式_2_简单工厂、工厂方法、抽象工厂比较
    SQL模拟padding函数
    MySqlHelper c#访问MySql的工具类
    常见数据库设计(1)——字典数据
    常见数据库设计(2)——历史数据问题之单记录变更
    设计模式_1_单例模式
    代码调用存储过程超时,SQL Server Management Studio里运行很快 (改进)
    转:Rowid和Rownum区别
    Oracle数据库中system和sys的区别
    转:Python之全局变量
  • 原文地址:https://www.cnblogs.com/lindows/p/13334325.html
Copyright © 2011-2022 走看看