我们常用到的MySQL字符型数据类型主要有3类:
char
varchar
text
char和varchar
在定义char和varchar列时可以申明1个数字参数,用于表明该列所能够存储的最大字符数,例如char(4)和varchar(4)能够存储最多4个字符。
char和varchar的区别主要体现在存储所需字节数、对字符串末尾空格的处理方式和最大字符数上:
char以固定字节数存储;varchar以可变字节数存储,并使用1个额外的字节存储字符串的长度,以下以UTF8(每字符3字节)编码为例:
值
char(4)存储所需字节数
varchar(4)存储所需字节数
''
12
1
'a'
12
2
'一二'
12
7
'一二三四'
12
13
char在查询时会自动去除字符串末尾的空格;varchar则会保留字符串末尾的空格,例如:
mysql> create table t1(c1 char(4), c2 varchar(4));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t1(c1, c2) values('a ', 'a ');
Query OK, 1 row affected (0.00 sec)
mysql> select concat(c1, 'b'), concat(c2, 'b') from t1;
+-----------------+-----------------+
| concat(c1, 'b') | concat(c2, 'b') |
+-----------------+-----------------+
| ab | a b |
+-----------------+-----------------+
1 row in set (0.00 sec)
在使用UTF8编码时,char列最多能存储255个字符;varchar列最多能存储21844个字符。
text
根据最大字符数和存储所需的字节数,text分为:
类型
最大字符数
存储所需字节数(UTF8编码)
tinytext
255
字符数 * 3 + 1
text
65535
字符数 * 3 + 2
mediumtext
16777215=16M
字符数 * 3 + 3
longtext
4294967295=4G
字符数 * 3 + 4
text对于字符串末尾空格的处理方式与varchar一致。
Tips
char以固定字节数存储,性能较高,但可能浪费存储空间,应权衡使用。
text的数据存储在行外,行内只存储指针,性能较低,应尽量避免使用。
字符列在与字符串比较时,对于末尾空格,=运算符会忽略空格,like运算符则不会,例如:
mysql> create table t1(c1 varchar(4));
Query OK, 0 rows affected (1.29 sec)
mysql> insert into t1 values('a ');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1 where c1 = 'a ';
+------+
| c1 |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> select * from t1 where c1 = 'a';
+------+
| c1 |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> select * from t1 where c1 like 'a ';
+------+
| c1 |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> select * from t1 where c1 like 'a';
Empty set (0.00 sec)