MySQL中的数据类型binary和varbinary详解
前⾔
BINARY和VARBINARY与 CHAR和VARCHAR类型有点类似,不同的是BINARY和VARBINARY存储的是⼆进制的字符串,⽽⾮字符型字符串。也就是说,BINARY和VARBINARY没有字符集的概念,对其排序和⽐较都是按照⼆进制值进⾏对⽐。BINARY(N)和VARBINARY(N)中的N指的是字节长度,⽽CHAR(N)和VARCHAR(N)中N指的是的字符长度。对于BINARY(10),其可存储的字节固定为10,⽽对于CHAR(10),其可存储的字节视字符集的情况⽽定。
我们来看下⾯的例⼦。
mysql> CREATE TABLE t (
-> a BINARY(1)
-> )ENGINE=InnoDB CHARSET=GBK;
Query OK, 0 rows affected (0.02 sec)
mysql> SET NAMES GBK;
Query OK, 0 rows affected (0.00 sec)
MySQL> INSERT INTO t SELECT '我';
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 1
mysql> SHOW WARNINGS\G;
*************************** 1. row ***************************
Level: Warning
Code: 1265
Message: Data truncated for column 'a' at row 1
1 row in set (0.00 sec)
mysql> SELECT a,HEX(a) FROM t\G;
*************************** 1. row ***************************
a:
HEX(a): CE
表t包含⼀个类型为BINARY(1)的列,因为BINARY(N)中N代表字节,⽽gbk字符集中的中⽂字符“我”需要占⽤2字节,所以在插⼊时给出警告,提⽰字符被截断。如果SQL_MODE为严格模式,则会直接报错。查看表t的内容,则可发现a中只存储了字符“我”的前⼀个字节,后⼀个字节被截断了。如果表t的a列中字符的类型为CHAR类型,则完全不会有上述问题,例如:mysql> CREATE TABLE t (
-> a CHAR(1)mysql中select
-> )ENGINE=InnoDB CHARSET=GBK;
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO t SELECT '我';
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT a,HEX(a) FROM t\G;
*************************** 1. row ***************************
a: 我
HEX(a): CED2
1 row in set (0.00 sec)
BINARY和VARBINARY对⽐CHAR和VARCHAR,第⼀个不同之处就是BINARY(N)和VARBINARY(N)中的N值代表的是字节数,⽽⾮字符长度;第⼆个不同点是,CHAR和VARCHAR在进⾏字符⽐较时,⽐较的只是字符本⾝存储的字符,忽略字符后的填充字符,⽽对于BINARY和VARBINARY来说,由于是按照⼆进制值来进⾏⽐较的,因此结果会⾮常不同,例如:mysql> SELECT
-> HEX('a'),
-> HEX('a '),
-
> 'a'='a '\G;
*************************** 1. row ***************************
HEX('a'): 61
HEX('a '): 612020
'a'='a ': 1
1 row in set (0.00 sec)
mysql> SELECT
-> HEX(BINARY('a')),
-> HEX(BINARY('a ')),
-> BINARY('a')= BINARY('a ')\G;
*************************** 1. row ***************************
HEX(BINARY('a')): 61
HEX(BINARY('a ')): 612020
BINARY('a')= BINARY('a '): 0
1 row in set (0.00 sec)
对于CHAR和VARCHAR来说,⽐较的是字符值,因此第⼀个⽐较的返回值是1。对于BINARY和VARBINARY来说,⽐较的是⼆进制的值,“a”的⼗六进制为61,“a  ”的⼗六进制为612020,显然不同,因此第⼆个⽐较的返回值为0。
第三个不同的是,对于BINARY字符串,其填充字符是0x00,⽽CHAR的填充字符为0x20。可能是因为BINARY的⽐较需要,0x00显然是⽐较的最⼩字符,⽰例如下:
mysql> CREATE TABLE t ( a BINARY(3));
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO t SELECT 'a';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT a,HEX(a) FROM t\G;
*************************** 1. row ***************************
a: a
HEX(a): 610000
1 row in set (0.00 sec)
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。