當前位置:編程學習大全網 - 遊戲軟體 - mysql 數據類型的詳解

mysql 數據類型的詳解

MySQL數據庫的表是壹個二維表,由壹個或多個數據列構成。

每個數據列都有它的特定類型,該類型決定了MySQL如何看待該列數據,我們可以把整型數值存放到字符類型的列中,MySQL則會把它看成字符串來處理。

MySQL中的列類型有三種:數值類、字符串類和日期/時間類。

從大類來看列類型和數值類型壹樣,都是只有三種。但每種列類型都還可細分。

下面對各種列類型進行詳細介紹。

數值類的數據列類型

數值型的列類型包括整型和浮點型兩大類。

TINYINT:1字節 非常小的正整數,帶符號:-128~127,不帶符號:0~255

SMALLINT:2字節 小整數,帶符號:-32768~32767,不帶符號:0~65535

MEDIUMINT:3字節 中等大小的整數,帶符號:-8388608~8388607,不帶符號:0~16777215

INT:4字節 標準整數,帶符號:-2147483648~2147483647,不帶符號:0~4294967295

BIGINT:8字節 大整數,帶符號:-9223372036854775808~9233372036854775807,不帶符號:0~18446744073709551615

FLOAT:4字節 單精度浮點數,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38

DOUBLE:8字節 雙精度浮點數,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308

DECIMAL:M+2字節 以字符串形式表示的浮點數,它的取值範圍可變,由M和D的值決定。

MYSQL支持大量的列類型,它們可以被分為 3 類:數字類型、日期和時間類型以及字符串(字符)類型。這個章節首先給出可用類型的概述,並且總結各類型所需的存儲需求,然後提供各類型中的類型範疇更詳細的描述。概述有意地簡化了。更詳細的說明應該參考特寫列類型的附加信息,例如妳能為其指定值的允許格式。

MySQL 支持的列類型在下面列出。下列代碼字母用於描述中:

M指出最大的顯示尺寸。最大的顯示尺寸長度為 255。D適用於浮點類型。指出跟隨在十進制小數點後的數字數量。最大可能值為 30,但不應大於M-2。

方括號 (“[”and“]”) 指定可選的類型修飾部份。

註意,如果為壹個列指定了ZEROFILL,MySQL 將自動為這個列添加UNSIGNED屬性。

警告:妳應該知道當在兩個整數類型值中使用減法時,如有壹個為UNSIGNED類型,那麽結果也是無符號的。查看章節6.3.5 Cast 函數。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]-128到127。無符號的範圍是0到255。

BITBOOL它們是TINYINT(1)的同義詞。

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列的壹些事情:

BIGINT或DOUBLE值來完成的,因此妳不應該使用大於9223372036854775807(63 bits) 的無符號大整數,除了位函數之外!如果妳這樣做了,結果中的某些大數字可能會出錯,因為將BIGINT轉換成DOUBLE時產生了舍入錯誤。MySQL 4.0 在下列情況下可以處理BIGINT:

在壹個BIGINT列中使用整數存儲壹個大的無符號值。

在MIN(big_int_column)和MAX(big_int_column)中。

當兩個操作數都是整數時使用操作符 (+、-、*、等)。

通常妳可以在壹個BIGINT列中以字符串方式存儲的壹個精確的整數。在這種情況下,MySQL 將執行壹個字符串到數字的轉換,包括無 intermediate 的雙精度表示法。

當兩個參數均是整數值時,“-”、“+”和“*”將使用BIGINT運算!這就意味著,如果兩個大整數的乘積(或函數的結果返回整數)的結果大於9223372036854775807時,妳可能會得到意想不到的結果。

FLOAT(precision) [UNSIGNED] [ZEROFILL]壹個浮點型數字。

precision可以是<=24作為壹個單精度的浮點數字和介於 25 和 53 之間作為壹個雙精度的浮點數字。這些類型與下面描述的FLOAT和DOUBLE類型相似。FLOAT(X)有與相應的FLOAT和DOUBLE類型同樣的範圍,但是顯示尺寸和十進制小數位數是未定義的。在 MySQL 3.23 中,它是壹個真實的浮點值。而在 MySQL 早期的版本中,FLOAT(precision)通常有 2 小數位。 註意,由於在 MySQL 中所有的計算都是以雙精度執行的,所以使用FLOAT可能帶來壹些意想不到的問題。查看章節A.5.6 解決沒有匹配行的問題。

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]壹個小的(單精度) 浮點數字。允許的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。如果UNSIGNED被指定,負值是不允許的。M是顯示寬度,D是小數位數。FLOAT沒有參數或有X<= 24 的FLOAT(X)代表壹個單精度的浮點數字。

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]壹個正常大小的(雙精度)浮上數字。允許的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。如果UNSIGNED被指定,負值是不允許的。M是顯示寬度,D是小數位數。DOUBLE沒胡參數或有 25 <=X<= 53 的FLOAT(X)代表壹個雙精度的浮點數字。

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

REAL[(M,D)] [UNSIGNED] [ZEROFILL]它們是DOUBLE同義詞。

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]壹個未壓縮(unpacked)的浮點數。運作如同壹個CHAR列:“unpacked” 意味著數字是以壹個字符串存儲的,值的每壹位將使用壹個字符。小數點並且對於負數,“-”符號不在M中計算(但是它們的空間是被保留的)。如果D是 0,值將沒有小數點或小數部份。DECIMAL值的最大範圍與DOUBLE壹致,但是對於壹個給定的DECIMAL列,實際的範圍可以被所選擇的M和D限制。如果UNSIGNED被指定,負值是不允許的。 如果D被忽略,缺省為 0。如果M被忽略,缺省為 10。 在 MySQL 3.23 以前,M參數必須包含符號與小數點所需的空間。

DEC[(M[,D])] [UNSIGNED] [ZEROFILL]

NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]DECIMAL的同義詞。

DATE壹個日期。支持的範圍是'1000-01-01'到'9999-12-31'。MySQL 以'YYYY-MM-DD'格式顯示DATE值,但是允許妳以字符串或數字給壹個DATE列賦值。查看章節6.2.2.2DATETIME、DATE和TIMESTAMP類型。

DATETIME壹個日期和時間的組合。支持的範圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL 以'YYYY-MM-DD HH:MM:SS'格式顯示DATETIME值,但是允許妳以字符串或數字給壹個DATETIME列賦值。查看章節6.2.2.2DATETIME、DATE和TIMESTAMP類型。

TIMESTAMP[(M)]壹個時間戳。範圍是'1970-01-01 00:00:00'到2037年間的任意時刻。 MySQL 4.0 和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式顯示的,它取決於M是否是14(或省略)、12、8或6,但是允許妳以字符串或數字給壹個TIMESTAMP列賦值。 從 MySQL 4.1 開始,TIMESTAMP以'YYYY-MM-DD HH:MM:DD'格式作為字符返回。如果妳妳希望以數字形式返回則必須在該時間戳字段後加上 +0。不同的時間戳長度是不支持的。從 MySQL 4.0.12 開始,選項--new可以被用來使服務器與 4.1 壹樣運作。TIMESTAMP列有益於記錄壹個INSERT或UPDATE操作的日期和時間,因為如果妳自己沒有給它賦值,它將被自動地設置為最近壹次操作的日期和時間。也可以通過給它賦壹個NULL而使它設置為當前的日期和時間。查看章節6.2.2 Date 和 Time 類型。 參數M只影響壹個TIMESTAMP列的顯示格式;它的值總是占用 4 個字節存儲。 註意,當TIMESTAMP(M)列的M是 8 或 14 時,它返回的是數字而其它的TIMESTAMP(M)列返回的是字符串。這僅僅是為了可以可靠地轉儲並恢復到其它格式的表中。查看章節6.2.2.2DATETIME、DATE和TIMESTAMP類型。TIME壹個時間。範圍是'-838:59:59'到'838:59:59'。MySQL 以'HH:MM:SS'格式顯示TIME值,但是允許妳使用字符串或數字來給TIME列賦值。查看章節6.2.2.3TIME類型。YEAR[(2|4)]壹個 2 或 4 位數字格式的年(缺省為 4 位)。允許的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。MySQL 以YYYY格式顯示YEAR值,但是允許妳使用字符串或數字來給YEAR列賦值。(YEAR類型在 MySQL 3.22 之前不支持。) 查看章節6.2.2.4YEAR類型。

[NATIONAL] CHAR(M) [BINARY]壹個定長的字符串,當存儲時,總是以空格填滿右邊到指定的長度。M的範圍是 0 到 255 (在 MySQL 3.23 版本之前為 1 到 255)。當該值被檢索時,尾部空格將被刪除。CHAR值根據缺省的字符集進行忽略大小寫的排索與比較,除非指定了關鍵詞BINARY。NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定義壹個CHAR列,它將使用缺省的字符集。這在 MySQL 中是默認的。

CHAR是CHARACTER的縮寫。 MySQL 允許以CHAR(0)類型建立壹個列。壹些老程序運行時必需壹個列,卻又並不使用這個列的值,妳就不得不為了適應它而建立該列,在這情況下,CHAR(0)將是很有益的。當需要壹個列僅保存兩個值時:壹個為CHAR(0)(該列沒有定義為NOT NULL),這將僅占用壹個比特位來存儲 2 個值:NULL或""。查看章節6.2.3.1CHAR和VARCHAR類型。CHAR這是CHAR(1)的同義詞。

[NATIONAL] VARCHAR(M) [BINARY]壹個變長的字符串。註意:尾部的空格在存儲時將會被刪除(這與 ANSI SQL 約規不同)。M的範圍是 0 到 255 (在 MySQL 4.0.2 之前的版本中是 1 到 255)。

VARCHAR值以大小寫忽略方式進行排索與比較,除非關鍵詞BINARY被指定。查看章節6.5.3.1 隱式的列定義變化。VARCHAR是CHARACTER VARYING的縮寫。查看章節6.2.3.1CHAR和VARCHAR類型。

TINYBLOBTINYTEXT壹個BLOB或TEXT列,最大長度為 255 (2^8 - 1) 個字符。查看章節6.5.3.1 隱式的列定義變化。查看章節6.2.3.2BLOB和TEXT類型。

BLOBTEXT壹個BLOB或TEXT列,最大長度為 65535 (2^16 - 1) 個字符。查看章節6.5.3.1 隱式的列定義變化。查看章節6.2.3.2BLOB和TEXT類型。

MEDIUMBLOBMEDIUMTEXT壹個BLOB或TEXT列,最大長度為 16777215 (2^24 - 1) 個字符。查看章節6.5.3.1 隱式的列定義變化。查看章節6.2.3.2BLOB和TEXT類型。

LONGBLOBLONGTEXT壹個BLOB或TEXT列,最大長度為 4294967295 (2^32 - 1) 個字符。查看章節6.5.3.1 隱式的列定義變化。註意,由於服務器/客戶端的協議以及 MyISAM 表通常有壹個 16M 每通信包/表行的限制,妳仍然不能使用這個類型的整個範圍。查看章節6.2.3.2BLOB和TEXT類型。ENUM('value1','value2',...)壹個枚舉類型。壹個僅能有壹個值的字符串對象,這個值選自值列'value1'、'value2'、...、NULL或特殊的""出錯值。壹個ENUM列可以有最大 65535 不同的值。查看章節6.2.3.3ENUM類型。SET('value1','value2',...)壹個集合。壹個能有零個或更多個值的字符串對象,其中每個值必須選自值列'value1'、'value2'、...。壹個SET列可以有最大 64 個成員。查看章節6.2.3.4SET類型。

MySQL 支持所有的 ANSI/ISO SQL92 數字類型。這些類型包括準確數字的數據類型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似數字的數據類型(FLOAT、REAL和DOUBLE PRECISION)。關鍵詞INT是INTEGER的同義詞,關鍵詞DEC是DECIMAL的同義詞。

NUMERIC和DECIMAL類型被 MySQL 以同樣的類型實現,這在 SQL92 標準中是允許的。他們用於保存對準確精度有重要要求的值,例如與金錢有關的數據。當以它們中的之壹聲明壹個列時,精度和數值範圍可以(通常是)被指定;例如:

salary DECIMAL(5,2)

在這個例子中,5(精度(precision)) 代表重要的十進制數字的數目,2(數據範圍(scale)) 代表在小數點後的數字位數。在這種情況下,因此,salary列可以存儲的值範圍是從-99.99到99.99。(實際上 MySQL 在這個列中可以存儲的數值可以壹直到999.99,因為它沒有存儲正數的符號)。

譯者註:

M 與D 對DECIMAL(M, D) 取值範圍的影響

類型說明 取值範圍(MySQL < 3.23) 取值範圍(MySQL >= 3.23)

DECIMAL(4, 1) -9.9 到 99.9 -999.9 到 9999.9

DECIMAL(5, 1) -99.9 到 999.9 -9999.9 到 99999.9

DECIMAL(6, 1) -999.9 到 9999.9 -99999.9 到 999999.9

DECIMAL(6, 2) -99.99 到 999.99 -9999.99 到 99999.99

DECIMAL(6, 3) -9.999 到 99.999 -999.999 到 9999.999

# 在MySQL 3.23 及以後的版本中,DECIMAL(M, D) 的取值範圍等於早期版本中的DECIMAL(M + 2, D) 的取值範圍。註釋結束:

在 ANSI/ISO SQL92 中,句法DECIMAL(p)等價於DECIMAL(p,0)。同樣的,在執行被允許決定值p的地方,句法DECIMAL等價於DECIMAL(p,0)。MySQL 目前還不支持DECIMAL/NUMERIC數據類型的這些變體形式中的任壹種。壹般來說這並不是壹個嚴重的問題,通過明確地控制精度和數值範圍可以得到這些類型的主要功能益處。

DECIMAL和NUMERIC值是作為字符串存儲的,而不是作為二進制浮點數,以便保護這些值的十進制精確度。壹個字符用於數值的每壹位、小數點(如果scale> 0) 和“-”符號(對於負值)。如果scale是 0,DECIMAL和NUMERIC值不包含小數點或小數部分。

DECIMAL和NUMERIC值的最大範圍與DOUBLE壹致,但是對於壹個給定的DECIMAL或NUMERIC列,它的實際範圍可制定該列時的precision或scale限制。當這樣的列被賦給了小數點的位數超過scale所指定的值時,該將根據scale進行四舍五入。當壹個DECIMAL或NUMERIC列被賦與壹個大小超過指定(或缺省)的precisionandscale的限止範圍時,MySQL 以該列範圍的端點值存儲該值。

  • 上一篇:電視劇特殊行動槍殺佟汗青那個女特務下場怎樣
  • 下一篇:Do you know 跟DID YOU KNOW分別在什麽場合下使用
  • copyright 2024編程學習大全網