zoukankan      html  css  js  c++  java
  • MySQL大小写敏感说明

    经常遇到的问题,一些不是特别重要但是又比较郁闷的事情。例如今天这个MySQL大小写敏感。
    先上测试结果。

    Linux环境下,不是windows平台下。区别很大。注意。

    一图胜千言
     
    mysql> show create table Ac;
    +-------+-------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                            |
    +-------+-------------------------------------------------------------------------------------------------------------------------+
    | Ac    | CREATE TABLE `Ac` (
      `a` varchar(20) DEFAULT NULL,
      `c` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+-------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
     
    mysql>
    mysql> insert into Ac  values ('1q','1q');
    Query OK, 1 row affected (0.00 sec)
     
    mysql> insert into Ac  values ('1Q','1Q');
    Query OK, 1 row affected (0.00 sec)
     
    mysql> select * from Ac WHERE a='1q';
    +------+------+
    | a    | c    |
    +------+------+
    | 1q   | 1q   |
    | 1Q   | 1Q   |
    +------+------+
    2 rows in set (0.00 sec)
     
    mysql> select * from AC ;
    ERROR 1146 (42S02): Table 'test.AC' doesn't exist
    mysql> select * from Ac  where A='1Q';
    +------+------+
    | a    | c    |
    +------+------+
    | 1q   | 1q   |
    | 1Q   | 1Q   |
    +------+------+
    2 rows in set (0.00 sec)
     
    如上的结果能反应说明以下结论。
     
    MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
      1、数据库名与表名是严格区分大小写的;
      2、表的别名是严格区分大小写的;
      3、列名与列的别名在所有的情况下均是忽略大小写的;
          4、字段内容默认情况下是大小写不敏感的。
     
    mysql中控制数据库名和表名的大小写敏感由参数lower_case_table_names控制,为0时表示区分大小写,为1时,表示将名字转化为小写后存储,不区分大小写。
    mysql> show variables like '%case%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | lower_case_file_system | OFF   |
    | lower_case_table_names | 0     |
    +------------------------+-------+
    2 rows in set (0.00 sec)
     
    修改cnf配置文件或者编译的时候,需要重启服务。
     
     
     MySQL存储的字段是不区分大小写的。这个有点不可思议。尤其是在用户注册的业务时候,会出现笑话。所以还是严格限制大小写敏感比如好。
     
    如何避免字段内容区分大小写。就是要新增字段的校验规则。
    可以看出默认情况下字段内容是不区分大小写的。大小写不敏感。
     
    mysql> create table aa (a varchar(20) BINARY  , c varchar(20)) ;
    Query OK, 0 rows affected (0.10 sec)
     
    mysql> show create table aa;
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | aa    | CREATE TABLE `aa` (
      `a` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
      `c` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
     
    mysql> select * from aa;
    +------+------+
    | a    | c    |
    +------+------+
    | a    | C    |
    | a    | C    |
    | A    | c    |
    +------+------+
    3 rows in set (0.00 sec)
     
    mysql> select * from aa where a = 'a';
    +------+------+
    | a    | c    |
    +------+------+
    | a    | C    |
    | a    | C    |
    +------+------+
    2 rows in set (0.00 sec)
     
    mysql> select * from aa where a = 'A';
    +------+------+
    | a    | c    |
    +------+------+
    | A    | c    |
    +------+------+
    1 row in set (0.00 sec)
     
    原因如下:
    字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则  .
    一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束 。比如 utf8字符集,utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的校对规则;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。
     
    记录下!
  • 相关阅读:
    hdu 4970 树状数组 “改段求段”
    hdu 2242 无向图/求用桥一分为二后使俩个bcc点权值和之差最小并输出 /缩点+2次新图dfs
    hdu3715 2-sat+二分
    hdu 3639 有向图缩点+建反向图+搜索
    hdu 3072 有向图缩点成最小树形图计算最小权
    hdu 3061 hdu 3996 最大权闭合图 最后一斩
    hdu 3879 hdu 3917 构造最大权闭合图 俩经典题
    hdu 4738 无向图缩点断桥 // 细节坑题
    hdu3452 无向树去掉最小的边集使任何叶子与根不连通 / 最小割
    hdu 3657 最小割的活用 / 奇偶方格取数类经典题 /最小割
  • 原文地址:https://www.cnblogs.com/wzmenjoy/p/4244545.html
Copyright © 2011-2022 走看看