MySQL常見數(shù)據(jù)類型:[數(shù)值]、[日期時間]和[字符串]類型。
網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序設計、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了莎車免費建站歡迎大家使用!
一、數(shù)值
1、整型
MySQL數(shù)據(jù)類型含義(有符號)tinyint1個字節(jié)
范圍(-128~127)smallint2個字節(jié)
范圍(-32768~32767)mediumint3個字節(jié)
范圍(-8388608~8388607)int4個字節(jié)
范圍(-2147483648~2147483647)bigint8個字節(jié)
范圍(+-9.22*10的18次方)
在int類型里,都是用來存儲整形數(shù)據(jù),可以根據(jù)實際需要選取數(shù)據(jù)類型。
取值范圍如果加了unsigned,則最大數(shù)值范圍翻倍,比如 tinyint unsigned的取值范圍為(0~256)。
int(m)里的m是表示SELECT查詢結(jié)果集中的顯示寬度,無實際意義,不影響實際的取值范圍
2、浮點型
MySQL數(shù)據(jù)類型含義float(m,d)單精度浮點型
8位精度(4字節(jié))
m總個數(shù),d小數(shù)位double(m,d)雙精度浮點型
16位精度(8字節(jié))
m總個數(shù),d小數(shù)位decimal(m,d)定點數(shù)
總個數(shù)m38, d小數(shù)位
設一個字段定義為float(5,2),如果插入一個數(shù)123.45678,實際數(shù)據(jù)庫里存的是123.46(四舍五入)
作用:用于存儲用戶的身高、體重、薪水等
(浮點數(shù)和定點數(shù)都可以用類型名稱后加(M,D)的方式來表示,
(M,D)表示一共顯示M位數(shù)字(整數(shù)位+小數(shù)位),
其中D位于小數(shù)點后面,M和D又稱為精度和標度。)
一、浮點數(shù)float類型測試
1、創(chuàng)建一個表
示例:
mysql create table test4(float_test float(5,2)); //一共5位,小數(shù)占2位
Query OK, 0 rows affected (0.00 sec)
2、查詢表結(jié)構(gòu)
示例:
mysql desc test4;
+------------+------------+------+-----+---------+-------+
| Field? ? ? | Type? ? ? | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| float_test | float(5,2) | YES? |? ? | NULL? ? |? ? ? |
+------------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
(float(5,2)
5是整數(shù)加小數(shù)的總長
,2是小數(shù)長度。
整數(shù)意味只有3位長度。)
3、插入合法數(shù)據(jù)
示例:
mysql insert into test4 values (10.2), (70.243), (70.246);
Query OK, 3 rows affected (0.00 sec)
Records: 3? Duplicates: 0? Warnings: 0
4、查詢表內(nèi)容
示例:
mysql select * from test4;
+------------+
| float_test |
+------------+
|? ? ? 10.20 |
|? ? ? 70.24 |
|? ? ? 70.25 |
+------------+
3 rows in set (0.00 sec)
5、插入非法數(shù)據(jù)
示例:
mysql insert into test4 values (1111.2);
ERROR 1264 (22003): Out of range value for column 'float_test' at row 1
二、LAB2:(精準小數(shù)decimal)
定點數(shù)decimal類型測試:
(定點數(shù)在MySQL內(nèi)部以字符串形式存儲,比浮點數(shù)更精確,
適合用來表示貨幣等精度高的數(shù)據(jù)。
decimal在不指定精度時,默認的整數(shù)位為10,默認的小數(shù)位為0)
1、創(chuàng)建一個表
mysql? create table test5(decimal_test decimal(5,2));
(總長度5位,小數(shù)占2位)
2、插入數(shù)據(jù)
示例:
mysql insert into test5 values (70.245);
Query OK, 1 row affected, 1 warning (0.05 sec)
(注意有警告??!? 超長部分不吉利,會四舍五入)
查看:mysql? select * from test5;
3、請思考如何創(chuàng)建整數(shù)9位,小數(shù)5位的數(shù)據(jù)類型
三、區(qū)別
三者區(qū)別介紹:
1、float:浮點型,含字節(jié)數(shù)為4,32bit,數(shù)值范圍為-3.4E38~3.4E38(7個有效位)
2、double:雙精度實型,含字節(jié)數(shù)為8,64bit數(shù)值范圍-1.7E308~1.7E308(15個有效位)
3、decimal:數(shù)字型,128bit,常用于銀行帳目計算。(28個有效位)
浮點型
float(255,30) 共255位 小數(shù)部分30位
double(255,30) 共255位 小數(shù)部分30位
dacimal(65,30) 共65位 小數(shù)部分30位
精準度驗證
create table t15(id float(255,30))
create table t15(id double(255,30))
create table t15(id decimal(60,30))
float double decimal
MySQL數(shù)據(jù)庫的表是一個二維表,由一個或多個數(shù)據(jù)列構(gòu)成。
每個數(shù)據(jù)列都有它的特定類型,該類型決定了MySQL如何看待該列數(shù)據(jù),我們可以把整型數(shù)值存放到字符類型的列中,MySQL則會把它看成字符串來處理。
MySQL中的列類型有三種:數(shù)值類、字符串類和日期/時間類。
從大類來看列類型和數(shù)值類型一樣,都是只有三種。但每種列類型都還可細分。
下面對各種列類型進行詳細介紹。
數(shù)值類的數(shù)據(jù)列類型
數(shù)值型的列類型包括整型和浮點型兩大類。
TINYINT:1字節(jié) 非常小的正整數(shù),帶符號:-128~127,不帶符號:0~255
SMALLINT:2字節(jié) 小整數(shù),帶符號:-32768~32767,不帶符號:0~65535
MEDIUMINT:3字節(jié) 中等大小的整數(shù),帶符號:-8388608~8388607,不帶符號:0~16777215
INT:4字節(jié) 標準整數(shù),帶符號:-2147483648~2147483647,不帶符號:0~4294967295
BIGINT:8字節(jié) 大整數(shù),帶符號:-9223372036854775808~9233372036854775807,不帶符號:0~18446744073709551615
FLOAT:4字節(jié) 單精度浮點數(shù),最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38
DOUBLE:8字節(jié) 雙精度浮點數(shù),最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308
DECIMAL:M+2字節(jié) 以字符串形式表示的浮點數(shù),它的取值范圍可變,由M和D的值決定。
MYSQL支持大量的列類型,它們可以被分為 3 類:數(shù)字類型、日期和時間類型以及字符串(字符)類型。這個章節(jié)首先給出可用類型的概述,并且總結(jié)各類型所需的存儲需求,然后提供各類型中的類型范疇更詳細的描述。概述有意地簡化了。更詳細的說明應該參考特寫列類型的附加信息,例如你能為其指定值的允許格式。
MySQL 支持的列類型在下面列出。下列代碼字母用于描述中:
M指出最大的顯示尺寸。最大的顯示尺寸長度為 255。D適用于浮點類型。指出跟隨在十進制小數(shù)點后的數(shù)字數(shù)量。最大可能值為 30,但不應大于M-2。
方括號 (“[”and“]”) 指定可選的類型修飾部份。
注意,如果為一個列指定了ZEROFILL,MySQL 將自動為這個列添加UNSIGNED屬性。
警告:你應該知道當在兩個整數(shù)類型值中使用減法時,如有一個為UNSIGNED類型,那么結(jié)果也是無符號的。查看章節(jié)6.3.5 Cast 函數(shù)。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]-128到127。無符號的范圍是0到255。
BITBOOL它們是TINYINT(1)的同義詞。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]一個小整數(shù)。有符號的范圍是-32768到32767。無符號的范圍是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]一個中等大小的整數(shù)。有符號的范圍是-8388608到8388607。無符號的范圍是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]一個正常大小的整數(shù)。有符號的范圍是-2147483648到2147483647。無符號的范圍是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]INT的同義詞。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]一個大的整數(shù)。有符號的范圍是-9223372036854775808到9223372036854775807。無符號的范圍是0到18446744073709551615。
你應該知道的有關BIGINT列的一些事情:
BIGINT或DOUBLE值來完成的,因此你不應該使用大于9223372036854775807(63 bits) 的無符號大整數(shù),除了位函數(shù)之外!如果你這樣做了,結(jié)果中的某些大數(shù)字可能會出錯,因為將BIGINT轉(zhuǎn)換成DOUBLE時產(chǎn)生了舍入錯誤。MySQL 4.0 在下列情況下可以處理BIGINT:
在一個BIGINT列中使用整數(shù)存儲一個大的無符號值。
在MIN(big_int_column)和MAX(big_int_column)中。
當兩個操作數(shù)都是整數(shù)時使用操作符 (+、-、*、等)。
通常你可以在一個BIGINT列中以字符串方式存儲的一個精確的整數(shù)。在這種情況下,MySQL 將執(zhí)行一個字符串到數(shù)字的轉(zhuǎn)換,包括無 intermediate 的雙精度表示法。
當兩個參數(shù)均是整數(shù)值時,“-”、“+”和“*”將使用BIGINT運算!這就意味著,如果兩個大整數(shù)的乘積(或函數(shù)的結(jié)果返回整數(shù))的結(jié)果大于9223372036854775807時,你可能會得到意想不到的結(jié)果。
FLOAT(precision) [UNSIGNED] [ZEROFILL]一個浮點型數(shù)字。
precision可以是=24作為一個單精度的浮點數(shù)字和介于 25 和 53 之間作為一個雙精度的浮點數(shù)字。這些類型與下面描述的FLOAT和DOUBLE類型相似。FLOAT(X)有與相應的FLOAT和DOUBLE類型同樣的范圍,但是顯示尺寸和十進制小數(shù)位數(shù)是未定義的。在 MySQL 3.23 中,它是一個真實的浮點值。而在 MySQL 早期的版本中,F(xiàn)LOAT(precision)通常有 2 小數(shù)位。 注意,由于在 MySQL 中所有的計算都是以雙精度執(zhí)行的,所以使用FLOAT可能帶來一些意想不到的問題。查看章節(jié)A.5.6 解決沒有匹配行的問題。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]一個小的(單精度) 浮點數(shù)字。允許的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。如果UNSIGNED被指定,負值是不允許的。M是顯示寬度,D是小數(shù)位數(shù)。FLOAT沒有參數(shù)或有X= 24 的FLOAT(X)代表一個單精度的浮點數(shù)字。
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]一個正常大小的(雙精度)浮上數(shù)字。允許的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。如果UNSIGNED被指定,負值是不允許的。M是顯示寬度,D是小數(shù)位數(shù)。DOUBLE沒胡參數(shù)或有 25 =X= 53 的FLOAT(X)代表一個雙精度的浮點數(shù)字。
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]
REAL[(M,D)] [UNSIGNED] [ZEROFILL]它們是DOUBLE同義詞。
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]一個未壓縮(unpacked)的浮點數(shù)。運作如同一個CHAR列:“unpacked” 意味著數(shù)字是以一個字符串存儲的,值的每一位將使用一個字符。小數(shù)點并且對于負數(shù),“-”符號不在M中計算(但是它們的空間是被保留的)。如果D是 0,值將沒有小數(shù)點或小數(shù)部份。DECIMAL值的最大范圍與DOUBLE一致,但是對于一個給定的DECIMAL列,實際的范圍可以被所選擇的M和D限制。如果UNSIGNED被指定,負值是不允許的。 如果D被忽略,缺省為 0。如果M被忽略,缺省為 10。 在 MySQL 3.23 以前,M參數(shù)必須包含符號與小數(shù)點所需的空間。
DEC[(M[,D])] [UNSIGNED] [ZEROFILL]
NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]DECIMAL的同義詞。
DATE一個日期。支持的范圍是'1000-01-01'到'9999-12-31'。MySQL 以'YYYY-MM-DD'格式顯示DATE值,但是允許你以字符串或數(shù)字給一個DATE列賦值。查看章節(jié)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值,但是允許你以字符串或數(shù)字給一個DATETIME列賦值。查看章節(jié)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,但是允許你以字符串或數(shù)字給一個TIMESTAMP列賦值。 從 MySQL 4.1 開始,TIMESTAMP以'YYYY-MM-DD HH:MM:DD'格式作為字符返回。如果你你希望以數(shù)字形式返回則必須在該時間戳字段后加上 +0。不同的時間戳長度是不支持的。從 MySQL 4.0.12 開始,選項--new可以被用來使服務器與 4.1 一樣運作。TIMESTAMP列有益于記錄一個INSERT或UPDATE操作的日期和時間,因為如果你自己沒有給它賦值,它將被自動地設置為最近一次操作的日期和時間。也可以通過給它賦一個NULL而使它設置為當前的日期和時間。查看章節(jié)6.2.2 Date 和 Time 類型。 參數(shù)M只影響一個TIMESTAMP列的顯示格式;它的值總是占用 4 個字節(jié)存儲。 注意,當TIMESTAMP(M)列的M是 8 或 14 時,它返回的是數(shù)字而其它的TIMESTAMP(M)列返回的是字符串。這僅僅是為了可以可靠地轉(zhuǎn)儲并恢復到其它格式的表中。查看章節(jié)6.2.2.2DATETIME、DATE和TIMESTAMP類型。TIME一個時間。范圍是'-838:59:59'到'838:59:59'。MySQL 以'HH:MM:SS'格式顯示TIME值,但是允許你使用字符串或數(shù)字來給TIME列賦值。查看章節(jié)6.2.2.3TIME類型。YEAR[(2|4)]一個 2 或 4 位數(shù)字格式的年(缺省為 4 位)。允許的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。MySQL 以YYYY格式顯示YEAR值,但是允許你使用字符串或數(shù)字來給YEAR列賦值。(YEAR類型在 MySQL 3.22 之前不支持。) 查看章節(jié)6.2.2.4YEAR類型。
[NATIONAL] CHAR(M) [BINARY]一個定長的字符串,當存儲時,總是以空格填滿右邊到指定的長度。M的范圍是 0 到 255 (在 MySQL 3.23 版本之前為 1 到 255)。當該值被檢索時,尾部空格將被刪除。CHAR值根據(jù)缺省的字符集進行忽略大小寫的排索與比較,除非指定了關鍵詞BINARY。NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定義一個CHAR列,它將使用缺省的字符集。這在 MySQL 中是默認的。
CHAR是CHARACTER的縮寫。 MySQL 允許以CHAR(0)類型建立一個列。一些老程序運行時必需一個列,卻又并不使用這個列的值,你就不得不為了適應它而建立該列,在這情況下,CHAR(0)將是很有益的。當需要一個列僅保存兩個值時:一個為CHAR(0)(該列沒有定義為NOT NULL),這將僅占用一個比特位來存儲 2 個值:NULL或""。查看章節(jié)6.2.3.1CHAR和VARCHAR類型。CHAR這是CHAR(1)的同義詞。
[NATIONAL] VARCHAR(M) [BINARY]一個變長的字符串。注意:尾部的空格在存儲時將會被刪除(這與 ANSI SQL 約規(guī)不同)。M的范圍是 0 到 255 (在 MySQL 4.0.2 之前的版本中是 1 到 255)。
VARCHAR值以大小寫忽略方式進行排索與比較,除非關鍵詞BINARY被指定。查看章節(jié)6.5.3.1 隱式的列定義變化。VARCHAR是CHARACTER VARYING的縮寫。查看章節(jié)6.2.3.1CHAR和VARCHAR類型。
TINYBLOBTINYTEXT一個BLOB或TEXT列,最大長度為 255 (2^8 - 1) 個字符。查看章節(jié)6.5.3.1 隱式的列定義變化。查看章節(jié)6.2.3.2BLOB和TEXT類型。
BLOBTEXT一個BLOB或TEXT列,最大長度為 65535 (2^16 - 1) 個字符。查看章節(jié)6.5.3.1 隱式的列定義變化。查看章節(jié)6.2.3.2BLOB和TEXT類型。
MEDIUMBLOBMEDIUMTEXT一個BLOB或TEXT列,最大長度為 16777215 (2^24 - 1) 個字符。查看章節(jié)6.5.3.1 隱式的列定義變化。查看章節(jié)6.2.3.2BLOB和TEXT類型。
LONGBLOBLONGTEXT一個BLOB或TEXT列,最大長度為 4294967295 (2^32 - 1) 個字符。查看章節(jié)6.5.3.1 隱式的列定義變化。注意,由于服務器/客戶端的協(xié)議以及 MyISAM 表通常有一個 16M 每通信包/表行的限制,你仍然不能使用這個類型的整個范圍。查看章節(jié)6.2.3.2BLOB和TEXT類型。ENUM('value1','value2',...)一個枚舉類型。一個僅能有一個值的字符串對象,這個值選自值列'value1'、'value2'、...、NULL或特殊的""出錯值。一個ENUM列可以有最大 65535 不同的值。查看章節(jié)6.2.3.3ENUM類型。SET('value1','value2',...)一個集合。一個能有零個或更多個值的字符串對象,其中每個值必須選自值列'value1'、'value2'、...。一個SET列可以有最大 64 個成員。查看章節(jié)6.2.3.4SET類型。
MySQL 支持所有的 ANSI/ISO SQL92 數(shù)字類型。這些類型包括準確數(shù)字的數(shù)據(jù)類型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似數(shù)字的數(shù)據(jù)類型(FLOAT、REAL和DOUBLE PRECISION)。關鍵詞INT是INTEGER的同義詞,關鍵詞DEC是DECIMAL的同義詞。
NUMERIC和DECIMAL類型被 MySQL 以同樣的類型實現(xiàn),這在 SQL92 標準中是允許的。他們用于保存對準確精度有重要要求的值,例如與金錢有關的數(shù)據(jù)。當以它們中的之一聲明一個列時,精度和數(shù)值范圍可以(通常是)被指定;例如:
salary DECIMAL(5,2)
在這個例子中,5(精度(precision)) 代表重要的十進制數(shù)字的數(shù)目,2(數(shù)據(jù)范圍(scale)) 代表在小數(shù)點后的數(shù)字位數(shù)。在這種情況下,因此,salary列可以存儲的值范圍是從-99.99到99.99。(實際上 MySQL 在這個列中可以存儲的數(shù)值可以一直到999.99,因為它沒有存儲正數(shù)的符號)。
譯者注:
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) 的取值范圍。注釋結(jié)束:
在 ANSI/ISO SQL92 中,句法DECIMAL(p)等價于DECIMAL(p,0)。同樣的,在執(zhí)行被允許決定值p的地方,句法DECIMAL等價于DECIMAL(p,0)。MySQL 目前還不支持DECIMAL/NUMERIC數(shù)據(jù)類型的這些變體形式中的任一種。一般來說這并不是一個嚴重的問題,通過明確地控制精度和數(shù)值范圍可以得到這些類型的主要功能益處。
DECIMAL和NUMERIC值是作為字符串存儲的,而不是作為二進制浮點數(shù),以便保護這些值的十進制精確度。一個字符用于數(shù)值的每一位、小數(shù)點(如果scale 0) 和“-”符號(對于負值)。如果scale是 0,DECIMAL和NUMERIC值不包含小數(shù)點或小數(shù)部分。
DECIMAL和NUMERIC值的最大范圍與DOUBLE一致,但是對于一個給定的DECIMAL或NUMERIC列,它的實際范圍可制定該列時的precision或scale限制。當這樣的列被賦給了小數(shù)點的位數(shù)超過scale所指定的值時,該將根據(jù)scale進行四舍五入。當一個DECIMAL或NUMERIC列被賦與一個大小超過指定(或缺省)的precisionandscale的限止范圍時,MySQL 以該列范圍的端點值存儲該值。
對于浮點列類型,在MySQL中單精度值使用4個字節(jié),雙精度值使用8個字節(jié)。
FLOAT類型用于表示近似數(shù)值數(shù)據(jù)類型。SQL標準允許在關鍵字FLOAT后面的括號內(nèi)選擇用位指定精度(但不能為指數(shù)范圍)。MySQL還支持可選的只用于確定存儲大小的精度規(guī)定。0到23的精度對應FLOAT列的4字節(jié)單精度。24到53的精度對應DOUBLE列的8字節(jié)雙精度。
MySQL允許使用非標準語法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。這里,“(M,D)”表示該值一共顯示M位整數(shù),其中D位位于小數(shù)點后面。例如,定義為FLOAT(7,4)的一個列可以顯示為-999.9999。MySQL保存值時進行四舍五入,因此如果在FLOAT(7,4)列內(nèi)插入999.00009,近似結(jié)果是999.0001。
MySQL將DOUBLE視為DOUBLE PRECISION(非標準擴展)的同義詞。MySQL還將REAL視為DOUBLE PRECISION(非標準擴展)的同義詞,除非SQL服務器模式包括REAL_AS_FLOAT選項。
為了保證最大可能的可移植性,需要使用近似數(shù)值數(shù)據(jù)值存儲的代碼應使用FLOAT或DOUBLE PRECISION,不規(guī)定精度或位數(shù)。
DECIMAL和NUMERIC類型在MySQL中視為相同的類型。它們用于保存必須為確切精度的值,例如貨幣數(shù)據(jù)。當聲明該類型的列時,可以(并且通常要)指定精度和標度;例如:
salary DECIMAL(5,2)
在該例子中,5是精度,2是標度。精度表示保存值的主要位數(shù),標度表示小數(shù)點后面可以保存的位數(shù)。
在MySQL 5.1中以二進制格式保存DECIMAL和NUMERIC值。
標準SQL要求salary列能夠用5位整數(shù)位和兩位小數(shù)保存任何值。因此,在這種情況下可以保存在salary列的值的范圍是從-999.99到999.99。
在標準SQL中,語法DECIMAL(M)等價于DECIMAL(M,0)。同樣,語法DECIMAL等價于DECIMAL(M,0),可以通過計算確定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC數(shù)據(jù)類型的變量形式。M默認值是10。
DECIMAL或NUMERIC的最大位數(shù)是65,但具體的DECIMAL或NUMERIC列的實際范圍受具體列的精度或標度約束。如果此類列分配的值小數(shù)點后面的位數(shù)超過指定的標度允許的范圍,值被轉(zhuǎn)換為該標度。(具體操作與操作系統(tǒng)有關,但一般結(jié)果均被截取到允許的位數(shù))。
一:MySQL數(shù)據(jù)類型
MySQL中定義數(shù)據(jù)字段的類型對你數(shù)據(jù)庫的優(yōu)化是非常重要的
MySQL支持多種數(shù)據(jù)類型,大致可以分為三類:數(shù)值 日期/時間和字符串
二、數(shù)值類型
1.整數(shù)類型
2.浮點數(shù)
如果希望保證值比較準確,推薦使用定點數(shù)數(shù)據(jù)類型。MySql中的浮點類型有float,double和real。他們定義方式為:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。
FLOAT和DOUBLE中的M和D的取值默認都為0,即除了最大最小值,不限制位數(shù)。允許的值理論上是-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。M、D范圍如下:
(MySql5.7實測,與IEEE標準計算的實際是不同的,下面介紹):M取值范圍為0~255。FLOAT只保證6位有效數(shù)字的準確性,所以FLOAT(M,D)中,M=6時,數(shù)字通常是準確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。
D取值范圍為0~30,同時必須=M。double只保證16位有效數(shù)字的準確性,所以DOUBLE(M,D)中,M=16時,數(shù)字通常是準確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。
CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉,所以,我們在存儲時字符串右邊不能有空格,即使有,查詢出來后也會被刪除。在存儲或檢索過程中不進行大小寫轉(zhuǎn)換。
三、時間日期類型(5)
該“0”值如下:
請點擊輸入圖片描述
四、各種類型占用的存儲
1.數(shù)值類型
請點擊輸入圖片描述
定點數(shù)的比較特殊,而且與具體版本也有關系,此處單獨解釋:
使用二進制格式將9個十進制(基于10)數(shù)壓縮為4個字節(jié)來表示DECIMAL列值。每個值的整數(shù)和分數(shù)部分的存儲分別確定。每個9位數(shù)的倍數(shù)需要4個字節(jié),并且“剩余的”位需要4個字節(jié)的一部分。下表給出了超出位數(shù)的存儲需求:
請點擊輸入圖片描述
2.時間日期
請點擊輸入圖片描述
從版本5.6.4開始,存儲需求就有所改變,根據(jù)精度而定。不確定部分需要的存儲如下:
請點擊輸入圖片描述
比如,TIME(0), TIME(2), TIME(4), 和TIME(6) 分別使用3, 4, 5, 6 bytes?!?/p>
3.字符串
請點擊輸入圖片描述
4.類型的選擇
為了優(yōu)化存儲,在任何情況下均應使用最精確的類型。
例如,如果列的值的范圍為從1到99999,若使用整數(shù),則MEDIUMINT UNSIGNED是好的類型。在所有可以表示該列值的類型中,該類型使用的存儲最少。
用精度為65位十進制數(shù)(基于10)對DECIMAL 列進行所有基本計算(+、-、*、/)。
使用雙精度操作對DECIMAL值進行計算。如果準確度不是太重要或如果速度為最高優(yōu)先級,DOUBLE類型即足夠了。為了達到高精度,可以轉(zhuǎn)換到保存在BIGINT中的定點類型。這樣可以用64位整數(shù)進行所有計算,根據(jù)需要將結(jié)果轉(zhuǎn)換回浮點值。
5.使用其他數(shù)據(jù)庫的SQL語句
為了使用為其它數(shù)據(jù)庫編寫的SQL執(zhí)行代碼,MySQL按照下表所示對列類型進行映射。通過這些映射,可以很容易地從其它數(shù)據(jù)庫引擎將表定義導入到MySQL中:
請點擊輸入圖片描述