MYSQL的binary解决mysql数据大小写敏感问题

【本文为转载】http://www.jb51.net/article/41546.htm

BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以 理解为在字符串比较的时候区分大小写
复制代码代码如下:
(说明不用binary是大写不敏感,用了binary后大小写敏感了)
mysql> select binary 'ABCD'='abcd' COM1, 'ABCD'='abcd' COM2;
+--------+-----------+
| COM1 | COM2 |
+--------+-----------+
|      0     |      1      |
+---------+-----------+
1 row in set (0.00 sec)

(仅仅有些而已!4.*以前)

因为有的MySQL特别是4.*以前的对于中文检索会有不准确的问题,可以在检索的时候加上binary。
建表:

复制代码代码如下:

create TABLE usertest (
id int(9) unsigned NOT NULL auto_increment,
username varchar(30) NOT NULL default '',
primary key (id)
)

插入数据:
复制代码代码如下:

insert into usertest (username) VALUES('美文');
insert into usertest (username) VALUES('美国项目');
insert into usertest (username) VALUES('李文');
insert into usertest (username) VALUES('老唐');
insert into usertest (username) VALUES('梦漂');
insert into usertest (username) VALUES('龙武');
insert into usertest (username) VALUES('夏');

例如:select * from usertest where username like '%夏%' ,结果七条记录都出来了,比较郁闷。
如果使用=而不是like的时候,select * from usertest where username = '夏' ,只出现一个结果。
因为mysql 的LIKE操作是按照ASCII 操作的,所以LIKE的时候是可能有问题的。问题继续:如果再加上:
复制代码代码如下:

insert into usertest (username) VALUES('文');
insert into usertest (username) VALUES('唐');

还是使用select * from usertest where username = '夏' ,结果还是出现3条记录,又郁闷了。 解决办法如下:
1.在create的时候就使用binary
复制代码代码如下:

username varchar(30) BINARY NOT NULL default '', 如果表已经建好了,使用:
alter table usertest modify username varchar(32) binary; 来就该表的属性。

2.在query的时候加上binary
select * from usertest where username like binary  '%夏%' ,就可以准确的查询出一条记录来。(类型一致)

char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。
如果需要存储的字符串的长度跟所有值的平均长度相差不大,适合用char,如MD5。
对于经常改变的值,char优于varchar,原因是固定长度的行不容易产生碎片。
对于很短的列,char优于varchar,原因是varchar需要额外一个或两个字节存储字符串的长度。

varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储
例外:Myisam引擎中使用ROW_FORMAT=FIXED时,每行使用相同的空间,造成浪费

char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较
复制代码代码如下:

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(4)   | YES  |     | NULL    |                |
| addr  | char(8)      | YES  |     | NULL    |                |
| bn    | varbinary(4) | YES  |     | NULL    |                |
| b     | binary(8)    | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
+----------------------+----------------------+
| concat("$",name,"$") | concat("$",addr,"$") |
+----------------------+----------------------+
| $asdf$               | $a$                  |
| $asdf$               | $a$                  |
| $a $                 | $a$                  |
| $a$                  | $a$                  |
| $t a$                | $a$                  |
+----------------------+----------------------+
mysql> select * from zcy where name='a ';   //由于name是varchar,比较时,'a '自动转换为'a'
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  3 | a    | a    | ab   | ab       |
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+
2 rows in set (0.00 sec)

mysql> select * from zcy where name='a';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  3 | a    | a    | ab   | ab       |
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+
2 rows in set (0.00 sec)

 
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(4)   | YES  |     | NULL    |                |
| addr  | char(8)      | YES  |     | NULL    |                |
| bn    | varbinary(4) | YES  |     | NULL    |                |
| b     | binary(8)    | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
+--------------------+-------------------+
| concat("$",bn,"$") | concat("$",b,"$") |
+--------------------+-------------------+
| $ab a$             | NULL              |
| $ab $              | $ab      $        |
| $ab$               | $ab      $        |
| $ab  $             | $a       $        |
| NULL               | $a       $        |
| NULL               | $abcde   $        |
| NULL               | $abcd1234$        |
+--------------------+-------------------+

binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制
binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节
进行比较时是按字节进行比较,而不是按字符(char),按字节比较比字符简单快速
按字符比较不区分大小写,而binary区分大小写,结尾使用\0填充,而不是空格
复制代码代码如下:

mysql> select * from zcy where b='a\0\0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  5 | t a  | a    | NULL | a        |
+----+------+------+------+----------+
mysql> select * from zcy where b='a \0\0\0\0\0\0'; 
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+

varbinary保存变长的字符串,后面不会补\0
mysql> select * from zcy where bn='ab';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  3 | a    | a    | ab   | ab       |
+----+------+------+------+----------+
1 row in set (0.01 sec)

mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  2 | asdf | a    | ab   | ab       |
+----+------+------+------+----------+
1 row in set (0.00 sec)

mysql> select * from zcy where bn='ab  ';
+----+------+------+------+----------+
| id | name | addr | bn   | b        |
+----+------+------+------+----------+
|  4 | a    | a    | ab   | a        |
+----+------+------+------+----------+
1 row in set (0.00 sec)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值