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