mysql提供了不少对字符数据的存储类型,包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、EMUM和SET等。本次主要介绍CHAR和VARCHAR。mysql
CHAR和VARCHAR相似,都用于保存比较短的字符串。但它们的存储和检索方式不一样。CHAR属于固定长度的字符类型,长度能够是0-255的任意值;VARCHAR属于可变长度的字符类型长度能够是0-65535的任意值。看下面的例子,字符编码为Latin1下的两种类型字符所占用的字节。sql
mysql> create table tCha( -> str1 CHAR(4), -> str2 VARCHAR(4) -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into tCha values(' ',''); Query OK, 1 row affected (0.00 sec) mysql> insert into tCha values('ab','ab'); Query OK, 1 row affected (0.00 sec) mysql> insert into tCha values('abcd','abcd'); Query OK, 1 row affected (0.00 sec) mysql> insert into tCha values('abcdef','abcdef'); ERROR 1406 (22001): Data too long for column 'str1' at row 1 mysql> insert into tCha values('abcd','abcdef'); ERROR 1406 (22001): Data too long for column 'str2' at row 1 mysql> select * from tCha; +------+------+ | str1 | str2 | +------+------+ | | | | ab | ab | | abcd | abcd | +------+------+ 3 rows in set (0.00 sec)
值 | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需求 |
---|---|---|---|---|
'' | ' ' | 4 | '' | 1 |
'ab' | 'ab' | 4 | ab | 3 |
'abcd' | 'abcd' | 4 | abcd | 5 |
'abcdefg' | 报错 | 报错 |
另外CHAR在检索的时候删除了尾部的空格,VARCHAR则是保留个尾部的空格,下面的例子将会给出区别:数据库
mysql> create table tCha1( -> v VARCHAR(4), -> c CHAR(4) -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into tCha1 values ('ab ','ab '); Query OK, 1 row affected (0.00 sec) mysql> select length(v),length(c) from tCha1; +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 2 | +-----------+-----------+ 1 row in set (0.00 sec) mysql> select CONCAT(v,'+'),CONCAT(c,'+') from tCha1; +---------------+---------------+ | CONCAT(v,'+') | CONCAT(c,'+') | +---------------+---------------+ | ab + | ab+ | +---------------+---------------+ 1 row in set (0.00 sec)
咱们能够很清楚的看到CHAR类型在插入和查询的时候删除了尾部的空格。编程
那么咱们在建立数据库的时候应该如何选择这两种数据类型呢?因为CHAR是固定长度的,因此它的处理速度要比VARCHAR快得多,可是浪费存储空间,对于长度变化不大而且查询速度较高的数据能够使用CHAR类型。编码
在mysql中不一样的存储引擎对CHAR和VARCHAR的使用原则有所不一样,MyISAM存储引擎建议使用CHAR类型,MEMORY目前都使用固定存储长度,二者是同样的;InoDB存储引擎建议使用VARCHAR类型。至于缘由后续会介绍。spa
还有一些学者对于CHAR(n)和VARCHAR(n)中的n表明的是字符个数,仍是字节数有点迷惑,那么最好的方法就是写一个例子观察一下,下面的例子实在Utf8编码下实现的。code
mysql> create table tCha2( -> v VARCHAR(4), -> c CHAR(4) -> ); Query OK, 0 rows affected (0.08 sec) mysql> insert into tCha2 values ('abab','aba Query OK, 1 row affected (0.01 sec) mysql> insert into tCha2 values('我爱编程',' Query OK, 1 row affected (0.00 sec) mysql> select length(v),length(c) from tCha2 +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 4 | | 12 | 12 | +-----------+-----------+ 2 rows in set (0.00 sec) mysql> select CONCAT(v,'+'),CONCAT(c,'+') fr +---------------+---------------+ | CONCAT(v,'+') | CONCAT(c,'+') | +---------------+---------------+ | abab+ | abab+ | | 我爱编程+ | 我爱编程+ | +---------------+---------------+ 2 rows in set (0.00 sec) mysql> select * from tCha2; +----------+----------+ | v | c | +----------+----------+ | abab | abab | | 我爱编程 | 我爱编程 | +----------+----------+ 2 rows in set (0.00 sec)
能够看到能够插入四个字符 12个字节,所以n表明的是字符而不是字节。ci