MySQL大小写敏感说明

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

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

一图胜千言
 
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下数据库名、表名、列名、别名大小写规则是这样的:
  一、数据库名与表名是严格区分大小写的;
  二、表的别名是严格区分大小写的;
  三、列名与列的别名在全部的状况下均是忽略大小写的;
      四、字段内容默认状况下是大小写不敏感的。
 
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表示二进制比较,一样也区分大小写 。
 
记录下!
相关文章
相关标签/搜索