mysql字符类型char和varchar

    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

相关文章
相关标签/搜索