mysql 大小写敏感比较 binary

mysql 的条件语句中默认是大小写不敏感的,就是说 ‘a’=’A’  结果为true;如果才能让 a !=A呢? 使用binary关键字,但是还要注意一下问题:

表结构:

mysql> desc innodb;

+———+————–+——+—–+———+——-+

| Field   | Type         | Null | Key | Default | Extra |

+———+————–+——+—–+———+——-+

| name    | varchar(100) | NO   | PRI |         |       |

| content | mediumtext   | YES  |     | NULL    |       |

+———+————–+——+—–+———+——-+

2 rows in set (0.09 sec)

 

表内容:

mysql> select * from innodb;

+——+———+

| name | content |

+——+———+

| c    | d       |

| d    | d       |

| e    | d       |

| kkk  | ttttt   |

+——+———+

4 rows in set (0.01 sec)

 

查询使用了主键索引:

mysql> desc select * from innodb where  name= "C";
+—-+————-+——–+——+—————+———+———+——-+——+————-+
| id | select_type | table  | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+—-+————-+——–+——+—————+———+———+——-+——+————-+
|  1 | SIMPLE      | innodb | ref  | PRIMARY       | PRIMARY | 202     | const |    1 | Using where |
+—-+————-+——–+——+—————+———+———+——-+——+————-+
1 row in set (0.00 sec)

 

使用binary时,主键索引用不上了:

mysql> desc select * from innodb where binary name= "C";
+—-+————-+——–+——+—————+——+———+——+——+————-+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+—-+————-+——–+——+—————+——+———+——+——+————-+
|  1 | SIMPLE      | innodb | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
+—-+————-+——–+——+—————+——+———+——+——+————-+
1 row in set (0.01 sec)

 

修改表结构,直接将列设置为

mysql> alter table innodb modify name  varchar(100) BINARY NOT NULL default ” ;
Query OK, 4 rows affected (0.40 sec)
Records: 4  Duplicates: 0  Warnings: 0

 

显示name列是binary的了,查看一下:

mysql> show create table innodb;
+——–+———————————————————————————
| Table  | Create Table
+——–+———————————————————————————
| innodb | CREATE TABLE innodb (
  name varchar(100) character set gbk collate gbk_bin NOT NULL default ”,
  content mediumtext,
  PRIMARY KEY  (name)
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+——–+———————————————————————————
1 row in set (0.01 sec)

 

再测试select看看是否能用上索引:

 

mysql> desc select * from innodb where name= "C";
+—-+————-+——-+——+—————+——+———+——+——+—————————————————–+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                               |
+—-+————-+——-+——+—————+——+———+——+——+—————————————————–+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
+—-+————-+——-+——+—————+——+———+——+——+—————————————————–+
1 row in set (0.00 sec)

 

很遗憾,索引还是没有用上

 

结论: 主键不要设置为binary的,否则索引无效,如果真的希望主键是大小写敏感的,可能有别的办法,继续探索。。。

 

binary的试试:

留下评论

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据