mysql字段類型、範圍詳解

TINYINT:有符號的範圍是-128至127,無符號的範圍是0到255,2的8次方【存儲大小爲 1 字節大小】

SMALLINT: 有符號的範圍是-32768至32767,無符號的範圍是0到65535,2的16次方【存儲大小爲 2 個字節大小】

MEDIUMINT:有符號的範圍是-8388608至8388607,無符號的範圍是0到16777215,2的24次方【存儲大小爲 3 個字節大小】

INT(integer):有符號的範圍是-2147483648至2147483647,無符號的範圍是0到4294967295,2的32次方【存儲大小爲 4 個字節大小】

BIGINT:有符號的範圍是-9223372036854775808至9223372036854775807,無符號的範圍是0到18446744073709551615,2的64次方【存儲大小爲 8 個字節大小】


char(0~255)  varchar(0~65535)中:不管漢字還是數字或者是字母都算是一個字符(空格也算)。一個漢字字符用utf8佔用3字節大小,用gbk佔用2字節大小。一般情況下,char會造成空間浪費,但是有速度優勢;而varchar節省了空間,但是速度就不如char。

char:尾部有空格會被截斷,所以查詢出來的結果最好trim一下

varchar:尾部有空格不會截斷


http://zhumeng8337797.blog.163.com/blog/static/10076891420115155956214/

http://www.blogguy.cn/archives/?article-809.html








MySQL支持大量的列類型,它可以被分爲3類:數字類型、日期和時間類型以及字符串(字符)類型。本節首先給出可用類型的一個概述,並且總結每個列類型的存儲需求,然後提供每個類中的類型性質的更詳細的描述。

概 述有意簡化,更詳細的說明應該考慮到有關特定列類型的附加信息,例如你能爲其指定值的允許格式。由MySQL支持的列類型列在下面。下列代碼字母用於描述 中:M指出最大的顯示尺寸。最大的合法的顯示尺寸是 255  。D適用於浮點類型並且指出跟隨在十進制小數點後的數碼的數量。最大可能的值是30,但是應該不大於M-2。方括號(“[”和“]”)指出可選的類型修飾 符的部分。注意,如果你指定一個了爲ZEROFILL,MySQL將爲該列自動地增加UNSIGNED屬性。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

一個很小的整數。有符號的範圍是-128到127,無符號的範圍是0到255。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

一個小整數。有符號的範圍是-32768到32767,無符號的範圍是0到65535。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

一箇中等大小整數。有符號的範圍是-8388608到8388607,無符號的範圍是0到16777215。

INT[(M)] [UNSIGNED] [ZEROFILL]

一個正常大小整數。有符號的範圍是-2147483648到2147483647,無符號的範圍是0到4294967295。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]

這是INT的一個同義詞。

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

一個大整數。有符號的範圍是-9223372036854775808到9223372036854775807,無符號的範圍是0到

18446744073709551615。 注意,所有算術運算用有符號的BIGINT或DOUBLE值完成,因此你不應該使用大於9223372036854775807(63位)的有符號大整 數,除了位函數!注意,當兩個參數是INTEGER值時,-、+和*將使用BIGINT運算!這意味着如果你乘2個大整數(或來自於返回整數的函數),如 果結果大於9223372036854775807,你可以得到意外的結果。一個浮點數字,不能是無符號的,對一個單精度浮點數,其精度可以 是<=24,對一個雙精度浮點數,是在25  和53之間,這些類型如FLOAT和DOUBLE類型馬上在下面描述。FLOAT(X)有對應的FLOAT和DOUBLE相同的範圍,但是顯示尺寸和小數 位數是未定義的。在MySQL3.23中,這是一個真正的浮點值。在更早的MySQL版本中,FLOAT(precision)總是有2位小數。該句法爲 了ODBC兼容性而提供。

FLOAT[(M,D)] [ZEROFILL]

一個小(單精密)浮點數字。不能無符號。允許的值 是-3.402823466E+38到-1.175494351E-38,0  和1.175494351E-38到3.402823466E+38。M是顯示寬度而D是小數的位數。沒有參數的FLOAT或有<24  的一個參數表示一個單精密浮點數字。

DOUBLE[(M,D)] [ZEROFILL]

一個正常大小(雙精密)浮點數字。不 能無符號。允許的值是-1.7976931348623157E+308到-2.2250738585072014E-308、  0和2.2250738585072014E-308到1.7976931348623157E+308。M是顯示寬度而D是小數位數。沒有一個參數的  DOUBLE或FLOAT(X)(25 < = X < = 53)代表一個雙精密浮點數字。

DOUBLE PRECISION[(M,D)] [ZEROFILL]

REAL[(M,D)] [ZEROFILL]

這些是DOUBLE同義詞。

DECIMAL[(M[,D])] [ZEROFILL]

一 個未壓縮(unpack)的浮點數字。不能無符號。行爲如同一個CHAR列:“未壓縮”意味着數字作爲一個字符串被存儲,值的每一位使用一個字符。小數 點,並且對於負數,“-”符號不在M中計算。如果D是0,值將沒有小數點或小數部分。DECIMAL值的最大範圍與DOUBLE相同,但是對一個給定的  DECIMAL列,實際的範圍可以通過M和D的選擇被限制。如果D被省略,它被設置爲0。如果M被省掉,它被設置爲10。注意,在MySQL3.22  裏,M參數包括符號和小數點。

NUMERIC(M,D) [ZEROFILL]

這是DECIMAL的一個同義詞。

DATE

一個日期。支持的範圍是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式來顯示DATE值,但是允許你使用字符串或數字把值賦給DATE列。

DATETIME

一 個日期和時間組合。支持的範圍是'1000-01-01 00:00:00'到'9999-12-31  23:59:59'。MySQL以'YYYY-MM-DD  HH:MM:SS'格式來顯示DATETIME值,但是允許你使用字符串或數字把值賦給DATETIME的列。

TIMESTAMP[(M)]

一 個時間戳記。範圍是'1970-01-01  00:00:00'到2037年的某時。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD  格式來顯示TIMESTAMP值,取決於是否M是14(或省略)、12、8或6,但是允許你使用字符串或數字把值賦給TIMESTAMP列。一個  TIMESTAMP列對於記錄一個INSERT或UPDATE操作的日期和時間是有用的,因爲如果你不自己給它賦值,它自動地被設置爲最近操作的日期和時 間。你以可以通過賦給它一個NULL值設置它爲當前的日期和時間。

TIME

一個時間。範圍是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式來顯示TIME值,但是允許你使用字符串或數字把值賦給TIME列。

YEAR[(2|4)]

一 個2或4位數字格式的年(缺省是4位)。允許的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069(  70-69)。MySQL以YYYY格式來顯示YEAR值,但是允許你把使用字符串或數字值賦給YEAR列。(YEAR類型在MySQL3.22中是新類 型。)

CHAR(M) [BINARY]

一個定長字符串,當存儲時,總是是用空格填滿右邊到指定的長度。M的範圍是1 ~  255個字符。當值被檢索時,空格尾部被刪除。CHAR值根據缺省字符集以大小寫不區分的方式排序和比較,除非給出BINARY關鍵詞。NATIONAL  CHAR(短形式NCHAR)是ANSI  SQL的方式來定義CHAR列應該使用缺省字符集。這是MySQL的缺省。CHAR是CHARACTER的一個縮寫。

[NATIONAL] VARCHAR(M) [BINARY]

一 個變長字符串。注意:當值被存儲時,尾部的空格被刪除(這不同於ANSI SQL規範)。M的範圍是1 ~ 255個字符。  VARCHAR值根據缺省字符集以大小寫不區分的方式排序和比較,除非給出BINARY關鍵詞值。 VARCHAR是CHARACTER  VARYING一個縮寫。

TINYBLOB

TINYTEXT

一個BLOB或TEXT列,最大長度爲255(2^8-1)個字符。

BLOB

TEXT

一個BLOB或TEXT列,最大長度爲65535(2^16-1)個字符。

MEDIUMBLOB

MEDIUMTEXT

一個BLOB或TEXT列,最大長度爲16777215(2^24-1)個字符。

LONGBLOB

LONGTEXT

一個BLOB或TEXT列,最大長度爲4294967295(2^32-1)個字符。

ENUM('value1','value2',...)

枚舉。一個僅有一個值的字符串對象,這個值式選自與值列表'value1'、'value2', ...,或NULL。一個ENUM最多能有65535不同的值。

SET('value1','value2',...)

一個集合。能有零個或多個值的一個字符串對象,其中每一個必須從值列表'value1', 'value2', ...選出。一個SET最多能有64個成員。

1 INT(M), M是管什麼用的?
      作爲對 ANSI/ISO SQL92 標準的一個擴展,MySQL 也支持上面的表格所列出的整型類型 TINYINT、MEDIUMINT 和  BIGINT。另外一個擴展是 MySQL 支持隨意指定一個整型數值的顯示格式,這通過在類型的基本關鍵詞後跟一個括號來實現(例如  INT(4))。這個可選的寬度規格說明是用於在數值顯示時,對某些值的寬度短於該列寬度的值進行左填補顯示的,而不是爲了限制在該列中存儲值的寬度,也  不是爲了限制那些超過該列指定寬度的值的可被顯示的數字位數。當與可選的擴展屬性 ZEROFILL  一起使用時,缺省填補用的空格被零代替。舉例來說,一個列被定義爲 INT(5) ZEROFILL,插入的值 4 被檢索出來時爲  00004。注意,如果在一個整型列中存儲一個超過顯示寬度的更大值時,當 MySQL  爲某些複雜的聯結(join)生成臨時表時,你可能會遇到問題,因爲在這種情況下,MySQL 信任地認爲所有的值均適合原始的列寬度。

       這個可選的寬度規格說明是用於在數值顯示時,對某些值的寬度短於該列寬度的值進行左填補顯示的,而不是爲了限制在該列中存儲值的寬度,也  不是爲了限制那些超過該列指定寬度的值的可被顯示的數字位數。注意,如果在一個整型列中存儲一個超過顯示寬度的更大值時,當mysql爲某些複雜的聯結 (join)生成臨時表時,你可能會遇到問題,因爲在這種情況下,mysql信任地認爲所有的值均適合原始的列寬度。

      而int本身就是4個字節 bigint是8個字節 所以說int(X)的含義就是 int決定數據存儲的字節 X表示期望數據的列寬度

    在SQL語句中int代表你要創建字段的類型,int代表整型,11代表字段的長度。

     這個代表顯示寬度
     整數列的顯示寬度與mysql需要用多少個字符來顯示該列數值,與該整數需要的存儲空間的大小都沒有關係,比如,不管設定了顯示寬度是多少個字符,bigint都要佔用8個字節。

     int是整型,(11)是指顯示字符的長度,但要加參數的,最大爲255,比如它是記錄行數的id,插入10筆資料,它就顯示00000000001  ~~~00000000010,當字符的位數超過11,它也只顯示11位,如果你沒有加那個讓它未滿11位就前面加0的參數,它不會在前面加0


MySQL字符串列類型區分

1.

首先CHAR, VARCHAR, TEXT和BINARY, VARBINARY, BLOB的區別:

CHAR, VARCHAR, TEXT稱爲非二進制字符串;

BINARY, VARBINARY, BLOB稱爲二進制字符串;

二進制字符串和非二進制字符串的區別是:
二進制字符串包含的是字節字符串,非二進制字符串包含的是字符字符串;

後者可以定義字符集,前者不可以;

而且排序和比較前者基於列值字節的數值值,後者則根據字母順序進行排序或比較;

BINARY類似與CHAR類型,但是保存二進制字符串而不是非二進制字符串;

VARBINARY類似與VARCHAR類型,但是保存二進制字符串而不是非二進制字符串;
同樣類似的BLOB對應TEXT類型(相應的有TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB和TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT)

2.

CHAR和VARCHAR相同之處:

都可以定義字符串的長度,如CHAR(M), VARCHAR(M);

不同之處:

CHAR(M)定義的列的長度爲固定的,M取值可以爲0~255之間,當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。

VARCHAR(M) 定義的列的長度爲可變長字符串,M取值可以爲0~65535之間,(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是 65,532字節)。VARCHAR值保存時只保存需要的字符數,另加一個字節來記錄長度(如果列聲明的長度超過255,則使用兩個字節)。 VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標準SQL。


注意:MySQL  數據庫的varchar類型在4.1以下的版本中的最大長度限制爲255,其數據範圍可以是0~255或1~255(根據不同版本數據庫來定)。在  MySQL5.0以上的版本中,varchar數據類型的長度支持到了65535,也就是說可以存放65532個字節的數據,起始位和結束位佔去了3個字   節,也就是說,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的數據可以使用可變長的varchar來存放,這樣就能有效的減少數據庫文  件的大小。


CHAR和VARCHAR最大的不同就是一個是固定長度,一個是可變長度。由於是可變長度,因此實際存儲的時候是實際字符串再加上一個記錄字符串長度的字節(如果超過255則需要兩個字節)

如果分配給CHAR或VARCHAR列的值超過列的最大長度,則對值進行裁剪以使其適合。如果被裁掉的字符不是空格,則會產生一條警告。如果裁剪非空格字符,則會造成錯誤(而不是警告)並通過使用嚴格SQL模式禁用值的插入。

由於BINARY和VARBINARY分別與CHAR和VARCHAR對應,因此兩者的區別也和CHAR和VARCHAR的區別類似。

但是注意VARBINARY定義的M值範圍爲0<=M<=255

3. VARCHAR和TEXT類型的區別:

TEXT類型不需要指定M值,其他方面與VARCHAR都類似:比如存儲的是可變長度,即不夠的部分不需要右邊空格填充;等等。

TEXT與VARCHAR類似,實際需要保存字符串本身外加兩個字節保存字符串的實際長度。

看下錶容易理解上面講述的區別:

字符串類型的存儲需求(M爲最大長度,L實際存儲字符串的長度)

列類型
存儲需求

CHAR(M)
M個字節,0 <= M <= 255 (L爲固定的=255,不夠補空格)

VARCHAR(M)
L+1個字節,其中L <= M 且0 <= M <= 65535(參見下面的註釋)(MySQL5.0之前都是最大255)

BINARY(M)
M個字節,0 <= M <= 255

VARBINARY(M)
L+1個字節,其中L <= M 且0 <= M <= 255

TINYBLOB, TINYTEXT
L+1個字節,其中L < 28 (256)

BLOB, TEXT
L+2個字節,其中L < 216 (65536)

MEDIUMBLOB, MEDIUMTEXT
L+3個字節,其中L < 224

LONGBLOB, LONGTEXT
L+4個字節,其中L < 232

ENUM('value1','value2',...)
1或2個字節,取決於枚舉值的個數(最多65,535個值)

SET('value1','value2',...)
1、2、3、4或者8個字節,取決於set成員的數目(最多64個成員)


解釋:

CHAR(M)爲固定長度,而且M必須要在0~255之間;

VARCHAR(M)保存可變長度,M定義了最大長度,M取值0~65535之間;

TINYTEXT不需要定義長度M值,長度範圍不超過28 (256);

TEXT不需要定義長度M值,長度範圍不超過216 (65536);

下面類似。。。

對於二進制字符串形式:BINARY(M),VARBINARY(M),TINYBLOB,BLOB等類似。

更詳細的參考:

http://dev.mysql.com/doc/refman/5.1/zh/column-types.html

4.

其他一些參考信息:

1、CHAR。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,比如定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間,不足的自動用空格填充。

2、 VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義爲  VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。爲什麼“+1”呢?這一個字節用於保存實際使用了多大的長度。 從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。

3.NCHAR、NVARCHAR、 NTEXT。這三種從名字上看比前面三種  多了個“N”。它表示存儲的是Unicode數據類型的字符。我們知道字符中,英文字符只需要一個字節存儲就足夠了,但漢字衆多,需要兩個字節存儲,英文   與漢字同時存在時容易造成混亂,Unicode字符集就是爲了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個  字節表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲  4000個字符,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。可以看出使用nchar、nvarchar  數據類型時不用擔心輸入的字符是英文還是漢字,較爲方便,但在存儲英文時數量上有些損失。

所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數字,用char/varchar



注意:

使用整數數據的精確數字數據類型。
bigint
從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(所有數字)。存儲大小爲 8 個字節。
int
從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(所有數字)。存儲大小爲 4 個字節。int 的 SQL-92 同義字爲 integer。
smallint
從 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型數據。存儲大小爲 2 個字節。
tinyint
從 0 到 255 的整型數據。存儲大小爲 1 字節。
註釋
在支持整數值的地方支持 bigint 數據類型。但是,bigint 用於某些特殊的情況,當整數值超過 int 數據類型支持的範圍時,就可以採用 bigint。在 SQL Server 中,int 數據類型是主要的整數數據類型。
在數據類型優先次序表中,bigint 位於 smallmoney 和 int 之間。
只有當參數表達式是 bigint 數據類型時,函數才返回 bigint。SQL Server 不會自動將其它整數數據類型(tinyint、smallint 和 int)提升爲 bigint。


哎,別好高騖遠了!走都還是磕磕絆絆,就像學人家飛,回過頭髮現自己基礎很薄弱,基礎一定要打牢啊!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章