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

相關文章
相關標籤/搜索