MySQL5.0.3之前varchar(n)這里的n表示字節數
MySQL5.0.3之后varchar(n)這里的n表示字符數,比如varchar(200),不管是英文還是中文都可以存放200個
MySQL要求一個行定義長度不能超過65535個字節,不包括text、blob等大字段類型,varchar長度受此長度限制,和其他非大字段加起來不能超過65535個字節.
超過以上限制則會報錯:
drop table if EXISTS test1111; create table test1111( id char(255) null, content varchar(21830) null )ENGINE=InnoDB DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
varchar(n)占用幾個字節跟字符集有關系:
字符類型若為gbk,每個字符占用2個字節
字符類型若為utf8,每個字符最多占用3個字節
根據字符集,字符類型若為gbk,每個字符占用2個字節,最大長度不能超過32766,字符類型若為utf8,每個字符最多占用3個字節,最大長度不能超過21845,若超過這個限制,則會自動將varchar類型轉為mediumtext或longtext,例如:
drop table if EXISTS test1111; create table test1111( id char(255) null, content varchar(63000) null ); desc test1111; 結果: CREATE TABLE `test1111` ( `id` char(255) DEFAULT NULL, `content` mediumtext ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在mysql中新建數據表的時候會有長度一說,其實用建表語句建數據表的時候也有涉及
例如:
CREATE TABLE user(
uid int(4),
name varchar(255),
passward varchar(20)
birthday data
)
不知道你有沒有注意這個數據類型后面的括號有什么玄機,今天看了《Mysql 5.6 從零開始學》這本書,算是把這個地方搞清楚了。
括號里的數字叫數據的寬度,我們不能一概而論,因為不同的數據類型對寬度的處理也不一樣:
1、整數類型,這里顯示的寬度和數據類型的取值范圍是沒有任何關系的,顯示寬度只是指明Mysql最大可能顯示的數字個數,數值的位數小於指定的寬度時會由空格填充;如果插入了大於顯示寬度的值,只要該值不超過該類型的取值范圍,數值依然可以插入,而且能夠顯示出來。
例如上面的udi,顯示的寬度是4,但是我向uid中插入100001,也是可以的,保存和顯示的都會是100001
如果你不設置寬度,系統將添加默認的寬度 tinyint(4),smallint(6),mediumint(9),int(11),bigint(20),這些默認的寬度是跟該類型的取值范圍長度相關。
2、字符串類型,字符串類型這個寬度才真的用上了。不管是char還是varchar,寬度都定義了字符串的最大長度
例如上面的 password varchar(20),如果你輸入了一個21個字符的密碼,那么保存和顯示的只會是前20個字符,你將丟失一個字符信息,char同理。由於varchar是變長存儲的,所以實際開發中我們一般都把varchar的寬度設為最長255,反正你沒用完它也不會浪費空間。
3、浮點和日期等數據類型對數據的寬度沒有要求,一般也不設置,默認是0