測試環境:mysql-5.7.17
各位dba同事及開發童鞋,相信你們看了這篇文章,會徹底明白char與varchar應該如何去選擇使用。首先講解一下char與varchar。
char(n):n的最大值為255
varchar(n):n的理論最大值65535,其實也就最多65532
這裡需要注意,在mysql中n表示的是字元長度,即能插入n個字元,無論字母、數字、還是漢字,這一點與oracle是不一樣,在oracle中n表示為位元組長度,utf8的模式下乙個漢字佔3個位元組,故oracle中的char(10),只能最多存3個漢字,mysql的char(10)可以儲存10個漢字。
驗證1,char(n)/varchar(n)中的n表示字元長度:下圖超過2位就報錯啦
那麼char與varchar到底如何選擇呢?都知道乙個是定長型別,乙個是變長型別,在mysql中定長與變長到底是什麼含義呢?先提出假設,定長即設定了char(10),那麼哪怕你的資料沒有10位,也會占用10的儲存空間,若是varchar(10)則不會。實驗驗證:
驗證2:
建立兩個表:
[dba_yzy@localhost][test1]> create table zifu1(name char(5));
query ok, 0 rows affected (0.80 sec)
[dba_yzy@localhost][test1]> create table zifu2(name varchar(5));
query ok, 0 rows affected (0.22 sec)
分別插入測試資料(下面執行32768次):
[dba_yzy@localhost][test1]> insert into zifu1 values(『12345』);
query ok, 1 row affected (0.02 sec)
[dba_yzy@localhost][test1]> insert into zifu2 values(『12345』);
query ok, 1 row affected (0.06 sec)
可以看到,兩個表的位元組大小是一樣的
現在我分別增大兩個表的資料型別長度,從5加到15;儲存的資料不動它。
[dba_yzy@localhost][test1]> alter table zifu1 modify name char(15);
query ok, 32768 rows affected (0.22 sec)
records: 32768 duplicates: 0 warnings: 0
[dba_yzy@localhost][test1]> alter table zifu2 modify name varchar(15);
query ok, 0 rows affected (0.01 sec)
records: 0 duplicates: 0 warnings: 0
可以看到,兩個表的位元組大小不一樣了,varchar沒變,char變大了。
好,證明了,char(n)型別是按照n指定的大小來分配的儲存空間,而varchar(n),則是根據資料實際的長度來分配的。我們不管mysql中當char型別的資料長度達不到n時,會用什麼去填充,這不重要,重要的是知道它確實會浪費儲存空間了
在實際生產中,各位開發童鞋為了省事,統統用varcahr,可以理解,因為能用到char型別的場景確實不多,乙個固定長度的字段,如身份證號,用char(18)與varcahr(18)是一樣的。並且在修改字段型別長度時,varchar列的加長在5.7中能做到秒級,char做不到。故為了統
一、為了磁碟容量、為了提公升變更速度,偏向於推薦使用varchar型別。但是在指定長度時不能太誇張,因為長度越大,會消耗更多的記憶體,mysql通常會分配固定大小的記憶體來儲存內部值,浪費了一些記憶體的同時,在排序方面也會更加糟糕。
這裡我解釋一下為何列舉型別字段不用char/varchar型別,假設有乙個欄位c1,目前取值:0、1、2,那麼目前用char(1)是沒問題,但是你能保證c1的可能值會達到10、11嗎?不得不考慮它的擴充套件,有的人會說,那可以設為char(2)或者varchar(2),但我認為,都不如用tinyint好,空間小,範圍大,nice!!!
char與int資料型別轉換
char 資料型別 和 character 物件封裝的值 基於原始的 unicode 規範,將字元定義為固定寬度的 16 位實體。unicode 標準曾做過修改,以允許那些其表示形式需要超過 16 位的字元。合法 點 的範圍現在是從 u 0000 到 u 10ffff,即通常所說的 unicode ...
MySQL之資料型別
資料型別是指列 儲存過程引數 表示式和區域性變數的資料特徵,它決定了資料的儲存方式,代表了不同的資訊型別。mysql當中資料型別大概有以下幾類 1.整型 都是無符號數情況下的範圍 tinyint 0 2 8 1 smallint 0 2 16 1 mediumint 0 2 24 1 int 0 2...
Mysql之資料型別
這篇部落格主要是講解mysql的資料型別以及屬性。一 mysql的資料型別 1.整型 int 1 tinyint m 乙個位元組表示 128 127 2 smallint m 兩個位元組表示 32768 32767 3 mediumint m 三個位元組表示 8388608 8388607 4 in...