Mysql中varchar與char的區別以及varchar(30)中的30代表的涵義
mysql中varchar與char的區別以及varchar(30)中的30代表的涵義
(1)varchar與char的區別
varchar儲存可變長字串,小於255位元組時需要1個額外位元組(大於255需要2個額外位元組)儲存長度,最大長度為65532位元組(所有列總和);
char儲存定長(right padding),讀取時會截斷末尾空格,長度最大為255字元;
char 與varchar都是用來儲存字串的,只是他們的儲存方式不一樣,char有固定的長度,而varchar屬於可變長的字元型別。
char是一種固定長度的型別,varchar則是一種可變長度的型別。
char(M)型別的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足。(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(M)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組)。
建議:
myisam儲存引擎建議使用固定長度,資料列代替可變長度的資料列。
memory儲存引擎目前都使用固定資料行儲存,因此無論使用char,varchar列都沒有關係。
Innodb儲存引擎建議使用varchar型別。
在MySQL中用來判斷是否需要進行對資料列型別轉換的規則:
1. 在一個資料表裡,如果每一個資料列的長度都是固定的,那麼每一個資料行的長度也將是固定的。
2. 只要資料表裡有一個資料列的長度是可變的,那麼各資料行的長度都是可變的。
3. 如果某個資料表裡的資料行的長度是可變的,那麼為了節約儲存空間,MySQL會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別。
對於MyISAM表,儘量使用char,對於那些經常需要修改而容易形成碎片的myisam和isam資料表就更是如此,它的缺點就是佔用磁碟空間;
對於InnoDB表,因為它的資料行內部儲存格式對固定長度的資料行和可變長度的資料行不加區分(所有資料行共用一個表頭部分,這個表頭部分存放著指向各個有關資料列的指標),所以使用char型別不見得會比使用varchar型別好。事實上,因為char型別通常要比varchar型別佔用更多的空間,所以從減少空間佔用量和減少磁碟i/o的角度,使用varchar型別反而更有利。
(2)varchar(30)中30的涵義
最大儲存30個字元;varchar(5)和(200)儲存hello所佔空間一樣,但後者在排序時會消耗更多記憶體,因為order by col 採用fixed_length計算col長度(memory)引擎一樣。
For example, a varchar(255) column can hold a string with a maximum length of 255 characters(字元而非位元組),對於latin1, ‘abcd’的L為4,儲存需要5個位元組;對於ucs2(雙位元組字元),則需要10個位元組儲存(最大長度為510>255,故需要額外2個位元組)
(3)int(20)中20的涵義
20表示最大顯示寬度為20,但仍佔4個位元組儲存,儲存範圍不變;
create table int_test(a int zerofill NOT NULL auto_increment, PRIMARY KEY (a));
create table int_test_4(a int(4) zerofill NOT NULL auto_increment, PRIMARY KEY (a));
select * from int_test;
+------------+
| a |
+------------+
| 0000000001 |
| 0000000002 |
| 0000000003 |
| 2147483648 |
+------------+
select * from int_test_4;
+------------+
| a |
+------------+
| 0001 |
| 0002 |
| 0003 |
| 2147483648 |
+------------+
(4)為什麼MySQL這樣設計?
對大多數應用沒有意義,只是規定一些工具用來顯示字元的個數;int(1)和int(20)儲存和結算均一樣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21374452/viewspace-2136268/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- MySQL中CHAR和VARCHAR區別MySql
- 談MySQL中char varchar區別MySql
- oracle中char與varchar2的區別Oracle
- char ,varchar2和varchar的區別
- varchar和char的區別
- mysql的varchar(N)和int(N)的含義及其與char區別MySql
- NTMySQL中varchar和char型別的區別heeMySql型別
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- Oracle CHAR,VARCHAR,VARCHAR2,nvarchar型別的區別與使用Oracle型別
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- MySQL中int、char、varchar的效能淺談MySql
- 【基礎】Oracle CHAR,VARCHAR,VARCHAR2,nvarchar型別的區別與使用Oracle型別
- Sql server char,nchar,varchar與Nvarchar的區別SQLServer
- char和varchar2的區別
- VARCHAR2(N CHAR)與VARCHAR2(N)的區別[Oracle基礎]Oracle
- MySQL資料型別操作(char與varchar)MySql資料型別
- char,nchar,varchar,nvarchar的區別和特點
- Oracle中NVARCHAR2與VARCHAR2的區別Oracle
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- char(n)和varchar2(n)區別
- MySQL中varchar和char定義長度是字元,與Oracle nvarchar2類似MySql字元Oracle
- 【基礎】ORACLE CHAR 與 VARCHAROracle
- MySQL CHAR和VARCHAR資料型別介紹MySql資料型別
- Oracle的資料型別:char/varchar2Oracle資料型別
- Sql Server 參考:char與varchar的選擇SQLServer
- 資料庫中varchar和Nvarchar區別與聯絡資料庫
- MYSQL INNODB主鍵使用varchar和int的區別MySql
- matlab中的fix,round,floor,ceil的區別與涵義Matlab
- MYSQL的CHAR和VARCHAR注意事項 以及binary和varbinary儲存方式MySql
- mysql中varchar型別最大長度測試MySql型別
- 30. JavaScript中的“=、 =、===”區別?JavaScript
- Oracle 中varchar2 和nvarchar2區別Oracle
- 自導自演的面試現場:說說char 和 varchar的區別你瞭解多少?面試
- varchar後面是否定義長度,還是有區別的
- varchar2 與 nvarchar2 區別
- char nchar varchar2 nvarchar2 區別-Oracle (varchar2 max 4K, 2K漢字)Oracle
- MySQL版本對varchar的定義和限制條件MySql