Mysql中varchar長度設定方法

2022-10-06 01:21:08 字數 3992 閱讀 6401

如果某一項中設定的是varchar(50)

那麼對英文當然是50

那麼對中文呢

utf-8的中文佔3個位元組

那麼,這個varchar(50)是不是只能存16個漢字了?

mysql varchar(50) 不管中文 還是英文 都是存50個的

mysqlzvonwilm5的文件,其中對v程式設計客棧archar欄位型別這樣描述:varchar(m) 變長字串。m 表示最大列長度。m的範圍是0到65,535。(varchar的最大實際長度由最長的行的大小和使用的字符集確定,最大有效長度是65,532位元組)。

為何會這般變換?真是感覺mysql的手冊做的太不友好了,因為你要仔細的繼續往下讀才會發現這段描述:mysql 5.1遵從標準sql規範,並且不刪除varchar值的尾部空格。varchar儲存時用乙個位元組或兩個位元組長的字首+資料。如果varchar列宣告的長度大於255,長度字首是兩個位元組。

好了,貌似懂了一點。但具體他說的長度大於255時使用2個位元組長度字首,小學減法題:65535 - 2 = 65533啊。不知道這些大牛如何計算的,暫且保留疑問吧?

注:我測試了一下使用utf8編碼,varchar的最大長度為21854位元組。

在mysql 5.0.45版本,資料庫編碼utf8下進行測試:varchar最長定義為21785。也就是說不論字母、數字、漢字,只能放21785個。

推想:varchar位元組最大65535,utf8編碼乙個字元3個位元組65535/3=21785。

補充知識:

1.varchar型別的變化

mysql 資料庫的varchar型別在4.1以下的版本中的最大長度限制為255,其資料範圍可以是0~255或1~255(根據不同版本資料庫來定)。在 www.cppcns.commysql5.0以上的版本中,varchar資料型別的長度支援到了65535,也就是說可以存放65532個位元組的資料,起始位和結束位占去了3個字 節,也就是說,在4.1或以下版本中需要使用固定的text或blob格式存放的資料可以使用可變長的varchar來存放,這樣就能有效的減少資料庫文 件的大小。

mysql 資料庫的varchar型別在4.1以下的版本中,nvarchar(儲存的是unicode資料型別的字元)不管是乙個字元還是乙個漢字,都存為2個字 節 ,一般用作中文或者其他語言輸入,這樣不容易亂碼 ;varchar: 漢字是2個位元組,其他字元存為1個位元組 ,varchar適合輸入英文和數字。

4.0版本以下,varchar(20),指的是20位元組,如果存放utf8漢字時,只能存6個(每個漢字3位元組) ;5.0版本以上,varchar(20),指的是20字元,無論存放的是數字、字母還是utf8漢字(每個漢字3位元組),都可以存放20個,最大大小是 65532位元組 ;varchar(20)在mysql4中最大也不過是20個位元組,但是mysql5根據編碼不同,儲存大小也不同,具體有以下規則:

a) 儲存限制

varchar 欄位是將實際內容單獨儲存在聚簇索引之外,內容開頭用1到2個位元組表示實際長度(長度超過255時需要2個位元組),因此最大長度不能超過65535。

b) 編碼長度限制

字元型別若為gbk,每個字元最多佔2個位元組,最大長度不能超過32766;

字元型別若為utf8,每個字元最多佔3個位元組,最大長度不能超過21845。

若定義的時候超過上述限制,則varchar欄位會被強行轉為text型別,並產生warning。

c) 行長度限制

導致實際應用中varchar長度限制的是乙個行定義的長度。 mysql要求乙個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示

error 1118 (42000): row size too large. the maximum row size for the used table type, not counting blobs, is 65535. you h**e to change some columns to text or blobs。

2.char(m), varchar(m)不同之處

char(m)定義的列的長度為固定的,m取值可以為0~255之間,當儲存char值時,在它們的右邊填充空格以達到指定的長度。當檢 索到char值時,尾部的空格被刪除掉。在儲存或檢索過程中不進行大小寫轉換。char儲存定長資料很方便,char欄位上的索引效率級高,比如定義 char(10),那麼不論你儲存的資料是否達到了10個位元組,都要占去10個位元組的空間,不足的自動用空格填充。

varchar(m)定義的列的長度為可變長字串,m取值可以為0~65535之間,(varchar的最大有效長度由最大行大小和使用 的字符集確定。整體最大長度是65,532位元組)。varchar值儲存時只儲存需要的字元數,另加乙個位元組來記錄長度(如果列宣告的長度超過255,則 使用兩個位元組)。varchar值儲存時不進行填充。當值儲存和檢索時尾部的空格仍保留,符合標準sql。varchar儲存變長資料,但儲存效率沒有 char高。如果乙個字段可能的值是不固定長度的,我們只知道它不可能超過10個字元,把它定義為 varchar(10)是最合算的。varchar型別的實際長度是它的值的實際長度+1。為什麼"+1"呢?這乙個位元組用於儲存實際使用了多大的長度。 從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。

char和varchar最大的不同就是乙個是固定長度,乙個是可變長度。由於是可變長度,因此實際儲存的時候是實際字zvonwilm符串再加上乙個記錄 字串長度的位元組(如果超過255則需要兩個位元組)。如果分配給char或varchar列的值超過列的最大長度,則對值進行裁剪以使其適合。如果被裁掉 的字元不是空格,則會產生一條警告。如果裁剪非空格字元,則會造成錯誤(而不是警告)並通過使用嚴格sql模式禁用值的插入。

3. varchar和text、blob型別的區別

varchar,blob和text型別是變長型別,對於其儲存需求取決於列值的實際長度(在前面的**中用l表示),而不是取決於型別 的最大可能尺寸。例如,乙個varchar(10)列能儲存最大長度為10個字元的乙個字串,實際的儲存需要是字串的長度 ,加上1個位元組以記錄字串的長度。對於字串'abcd',l是4而儲存要求是5個位元組。

blob和text型別需要1,2,3或4個位元組來記錄列值的長度,這取決於型別的最大可能長度。varchar需要定義大小,有65535位元組的最大限制;text則不需要。如果你把乙個超過列型別最大長度的值賦給乙個blob或text列,值被截斷以適合它。

乙個blob是乙個能儲存可變數量的資料的二進位制的大物件。4個blob型別tinyblob、blob、mediumblob和longblob僅僅在他們能儲存值的最大長度方面有所不同。

blob 可以儲存,text不行,text只能儲存純文字檔案。4個text型別tinytext、text、mediumtext和longtext對應於 4個blob型別,並且有同樣的最大長度和儲存需求。在blob和text型別之間的唯一差別是對blob值的排序和比較以大小寫敏感方式執行,而對 text值是大小寫不敏感的。換句話說,乙個text是乙個大小寫不敏感的blob。

4.總結char,varchar,text區別

長度的區別,char範圍是0~255,varchar最長是64k,但是注意這裡的64k是整個row的長度,要考慮到其它的 column,還有如果存在not null的時候也會占用一位,對不同的字符集,有效長度還不一樣,比如utf8的,最多21845,還要除去別的column,但是varchar在一般 情況下儲存都夠用了。如果遇到了大文字,考慮使用text,最大能到4g。

效率來說基本是char>varchar>text,但是如果使用的是innodb引擎的話,推薦使用varchar代替char

char和varchar可以有預設值,text不能指定預設值

資料庫選擇合適的資料型別儲存還是很有必要的,對效能有一定影響。這裡在零碎記錄兩筆,對於int型別的,如果不需要訪問負值,最好加上unsigned;對於經常出現在where語句中的字段,考慮加索引,整形的尤其適合加索引。

以上所述是小編給大家介紹的mysql中varchar長度設定方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們**的支援!

本文標題: mysql中varchar長度設定方法

本文位址: /shujuku/mysql/155610.html

mysql中的設定varchar長度問題

如果某一項中設定的是varchar 50 那麼對英文當然是50 那麼對中文呢 utf 8的中文佔3個位元組 那麼,這個varchar 50 是不是只能存16個漢字了?mysql varchar 50 不管中文 還是英文 都是存50個的 適用於mysql5,低版本不支援 mysql5的文件,其中對va...

MySql中的varchar長度究竟是位元組還是字元

今天在設計表的時候,遇到個小問題,由於不知道未來將要儲存的資料有多長 資料是通過第三方http介面提供的,根據sample顯示,資料大概是如下 也就是6個字元。我在設計表的時候,有點猶豫,本來準備設計為varchar 6 但擔心是按位元組計算的,會導致存不下。資料庫採用utf8編碼 於是自己試了下,...

Mysql的 VARCHAR欄位最大長度到底是多少

mysql5.0.3之前varchar n 這裡的n表示位元組數 mysql5.0.3之後varchar n 這裡的n表示字元數,比如varchar 200 不管是英文還是中文都可以存放200個 注 這兩個是完全不一樣的單位,位元組表示字元佔的多少k,字元表示乙個完整的字元 mysql要求乙個行定義...