MySql之char與varchar,mysqlvarchar
MySql之char與varchar的區別
char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是:
1. char(M)類型的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉)
在varchar(M)類型的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組).
2.char的效率比varchar2的效率稍高。
3.目前varchar是varchar2的同義字。工業標準的varchar類型可以儲存Null 字元串,但是oracle不這樣做,儘管它保留以後這樣做的權利。Oracle自己開發了一個資料類型varchar2,這個類型不是一個標準的varchar,它將在資料庫中varchar列可以儲存Null 字元串的特性改為儲存null值。如果你想有向後相容的能力,Oracle建議使用varchar2而不是varchar。
何時該用char,何時該用varchar2?
char與varchar2是一對矛盾的統一體,兩者是互補的關係.
varchar比char節省空間的,在效率上比char會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在資料庫設計上常說的‘以空間換效率’。
varchar2 雖然比char節省空間的,但是如果一個varchar2列經常被修改,而且每次被修改的資料的長度不同,這會引起‘行遷移’(Row Migration)現象,而這造成多餘的I/O,是資料庫設計和調整中要儘力避免的,在這種情況下用char代替varchar2效果會更好一些。
下面是在mysql中的實驗證明:
mysql> #tee 將命令框中的內容輸入到指定檔案
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| student |
| test |
+--------------------+
6 rows in set (0.02 sec)
mysql> use student;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| infotb |
+-------------------+
1 row in set (0.00 sec)
mysql> desc infotb;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | tinyint(4) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| tel | varchar(20) | YES | | NULL | |
| ad | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> select * from infotb;
+----+----------+------+-------------+----------------+
| id | name | sex | tel | ad |
+----+----------+------+-------------+----------------+
| 13 | cyz | NULL | 123 | 123 |
| 15 | cool | NULL | cool | cool |
| 16 | this | NULL | is | great |
| 17 | 哈嘍 | NULL | NULL | NULL |
| 22 | QQ群 | NULL | 111 | 河南 |
| 24 | 123 | NULL | 123 | 123 |
| 26 | 哈哈哈哈 | NULL | 123123 | 阿斯頓 |
| 27 | tom | NULL | 123 | NULL |
| 28 | tom2 | NULL | 1233 | NULL |
| 29 | tom | NULL | 123 | NULL |
| 30 | tom2 | NULL | 1233 | NULL |
| 31 | tom | NULL | 123 | NULL |
| 32 | tom2 | NULL | 1233 | NULL |
+----+----------+------+-------------+----------------+
22 rows in set (0.01 sec)
mysql> create table test (
-> ca char(4) not null defalut '',
-> vca varchar(4) not null defalut ''
-> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'defalut '',
vca varchar(4) not null defalut ''
)' at line 2
mysql> create table test (
-> ca char(4) not null default '',
-> vca varchar(4) not null default ''
-> );
Query OK, 0 rows affected (0.22 sec)
mysql> #練習char與varchar的區別
mysql> insert into test(ca,vca) value('aa ','aa ');
Query OK, 1 row affected (0.09 sec)
mysql> select * from test;
+----+-----+
| ca | vca |
+----+-----+
| aa | aa |
+----+-----+
1 row in set (0.00 sec)
mysql> #concat 連接字串函數
mysql> select concat(ca,'!'),concat(vca,'!') from test;
+----------------+-----------------+
| concat(ca,'!') | concat(vca,'!') |
+----------------+-----------------+
| aa! | aa ! |
+----------------+-----------------+
1 row in set (0.18 sec)
mysql> #char和varchar分別稱為定長和變長類型
mysql> #對於char(N),不夠N個長度,用空格在尾部補夠N個長度,浪費了尾部。
mysql> #而對於varchar(N),不用空格補齊,但在列內容前,有1-2個位元組來標誌該列的內容長度。
mysql> #char讀取速度比較快,但浪費儲存空間,末尾有空格的字串讀取時,空格讀不出來
mysql> #varchar讀取速度沒有char快,但充分利用儲存空間,能夠儲存任一字元。
mysql> exit;
#tee 將命令框中的內容輸入到指定檔案