mysql字段的char和varchar設(shè)計區(qū)別
1,設(shè)計背景
在進(jìn)行交易日志表設(shè)計卡號,姓名,身份證,手機(jī)號時,在想為什么有的時候是字段類型為char,有的時候是varchar,而且設(shè)計的長度也是不一致的。若是一般記錄不多的表,影響會不大,但是當(dāng)數(shù)據(jù)庫的記錄到千萬級別的話,就可能影響到存取速度等,所有有必要進(jìn)行了解。
2,char的理解
char顧名思義字符類型,占用一個字節(jié),而且是長度是不可變的。什么意思呢,就是說當(dāng)把字段定為char(10)時,而此時內(nèi)容"coder"只有5個字節(jié)的長度,則剩下的5個長度為空且占著,相當(dāng)于分配了10個空間存儲,而當(dāng)取數(shù)據(jù)的時候會進(jìn)行trim(),去空格的操作。因為空間固定所以進(jìn)行存取的速度更快,不過空間可能會浪費(fèi),相當(dāng)于是用空間來換時間。
char對于英文字母和數(shù)字存儲是每個占一個字節(jié)
3,varchar的理解
varchar是可變的字符類型 ,會根據(jù)內(nèi)容的長度進(jìn)行匹配,如定義為
varchar(10),內(nèi)容為"coder"的話,就分配的長度就是5,而10是為最大值,不會浪費(fèi)空間,但是存取和操作的速度慢,用時間換空間,varchar對于每個英文字符和漢字都是占用2個字節(jié),VARCHAR數(shù)據(jù)類型時,會多用1個字節(jié)用來存儲長度信息。這個管理上的開銷CHAR 字符類型是沒有的。為了考慮冗余,可以留10%左右的字符長度。千萬不能認(rèn)為其為根據(jù)實際 長度來分配存儲空間,因為對于內(nèi)存來 說其時使用固定大小的內(nèi)存塊來保存值
4,Oracle中varchar2型與varchar型
1、varchar2把所有字符都占兩字節(jié)處理(一般情況下),varchar只對漢字和全角等字符占兩字節(jié),數(shù)字,英文字符等都是一個字節(jié);
2、varchar2把空串等同于null處理,而varchar仍按照空串處理;
3、varchar2字符要用幾個字節(jié)存儲,要看數(shù)據(jù)庫使用的字符集,
大部分情況下建議使用varchar2類型,可以保證更好的兼容性。
5,使用場景
char使用:適用于固定長度的字段,如性別、身份證號、手機(jī)號等。在實際項目中, 如果某個字段的字符長度比較短此時一般是采用固定字符長度。
varchar適用于非固定長度的字段,如返回碼、城市名等。
6,其他知識
nvarchar中帶“n”可以理解為兼容unicode 編碼和非unicode 編碼,故而更適用兼容不同類型的字符。本人在項目中一直都是首選nvachar類型。若不帶“n”,則意味著只能存放unicode編碼的字符。
在Unicode中:無論英文還是日文中文都是占兩個編碼位置(雙字節(jié)),現(xiàn)在的操作系統(tǒng)用的都是Unicode編碼,所以這時中文就不用進(jìn)行轉(zhuǎn)換為單字節(jié)進(jìn)行運(yùn)行了,效率就提高了(Unicode幾乎支持所有的語言編碼)。區(qū)別于ASCII編碼:英文字符占一個編碼位置(單字節(jié)),而中文占兩個位置(雙字節(jié))。