Mysql中varchar長度設置辦法。本站提示廣大學習愛好者:(Mysql中varchar長度設置辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Mysql中varchar長度設置辦法正文
假如某一項中設置的是varchar(50)
那末對英文固然是50
那末對中文呢
utf-8的中文占3個字節
那末,這個varchar(50)是否是只能存16個漢字了?
mysql varchar(50) 不論中文 照樣英文 都是存50個的
MySQL5的文檔,個中對varchar字段類型如許描寫: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(依據分歧版本數據庫來定)。在 MySQL5.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 have 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最年夜的分歧就是一個是固定長度,一個是可變長度。因為是可變長度,是以現實存儲的時刻是現實字符串再加上一個記載 字符串長度的字節(假如跨越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長度設置辦法,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!