MySQL大小写敏感说明,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表示二进制比较,同样也区分大小写
。   记录下!

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

Mysql默认的字符检索策略:
utf8_general_ci  表示不区分大小写,这个是utf8字符集默认的校对规则;
utf8_general_cs  表示区分大小写,
utf8_bin         表示二进制比较,同样也区分大小写

注:Mysql5.6.10版本中,不支持utf8_general_cs

1.在表级别控制
create table test01(
id int primary key,
name varchar(32) not null
)engine=innodb collate=utf8_bin

insert into test01(id,name)values(1,'a');
insert into test01(id,name)values(1,'A');

创建表是指定 collate=utf8_bin

2.在数据库级别控制:
ALTER DATABASE `databaseName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
未测试

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注