首先我們需要知道一個字節(jié)等于8位,位就是計算機能識別的單位捐康,即0101,對于ascii碼入热,一個字符就是一個字節(jié)卢肃,對于gbk,兩個字節(jié)是一個字符才顿,對于utf8,三個字節(jié)是一個字符尤蒿;
int(n)之n
create table text(num int(n) unsigned),那個n并不是代表存儲的位數(shù):我們來驗證一下:我們在建表的時候給int 加了一個1郑气,我們可以看到并不是只能插進去一位,所以那個n并不是位數(shù)腰池,當我們插入的值大于了它最大能插入的值尾组,插進去的就是它的最大值忙芒,int存儲的是4個字節(jié),也就是32位讳侨,所以最大就是2的32次方呵萨,
那么n到底起個什么作用呢?其實n只有和關鍵字zerofill一起的時候才會有作用跨跨,當和zerofill一起作用于字段的時候潮峦,如果插入的值的位數(shù)小于n那么就是填充零,如果大于n就不作用勇婴;所以n只有和zerofill在一起才會有作用忱嘹;
char(n)之n
char(n)的n又是什么含義呢?是字節(jié)耕渴,還是字符拘悦,還是長度呢?首先我們知道char是存定長的字符橱脸,長度不夠的會補空格础米,現(xiàn)在來驗證一下n到底是什么:從下面可以看出我們插入了多條數(shù)據(jù),當不足n長度的時候會填充空格添诉,超過n會截取屁桑,我們知道在utf8編碼的情況下,一個中文字符是3個字節(jié)吻商,所以這個n肯定不是字節(jié)了掏颊,很明顯這個n表示的應該是字符,其實就是長度;
這就是字節(jié)和字符的對應了艾帐;length取得是字節(jié)乌叶,char_length取得是字符;
char(n)的n其實就是字符的長度柒爸,最大可以存255個字符准浴,
varchar(n)和char差不多,只不過varchar是變長捎稚,可以更合理的利用空間來存儲數(shù)據(jù)乐横,varchar的n也是字符長度;可以存21844個字符長度
最后在介紹一下sql_mode,sql_mode是sql插入數(shù)據(jù)的模式今野,主要有兩種葡公,一種是默認的寬松的插入模式ANSI,寬松的模式插入的時候如果超過長度条霜,超過最大值就會截取催什,保證數(shù)據(jù)都能插進去,如果是嚴格的STRICT_TRANS_TABLES就會嚴格的比較數(shù)據(jù)宰睡,只要數(shù)據(jù)不在范圍內就會報錯蒲凶;
默認模式下气筋,超過范圍也能插入,只不過會有警告旋圆;
嚴格模式下宠默,只要超過長度就會報錯;