mac11.14 mysql_mysql 5.7 11 章 数据类型(1)
前言 這是 一篇mysql 5.7 官方手冊的部分翻譯,目的加強自己的理解 ,和 提升英文水平。不保證質量,速度。部分我感覺沒有多大用處的部分沒有做翻譯。英語手冊地址 https://dev.mysql.com/doc/refman/5.7/en/data-types.html
----------------------------------------------
內容包括
11.1 數據類型 概況
11.2 數字類型
11.3 日期和時間類型
11.4 字符串類型
11.5 空間數據類型
11.6 json數據類型
11.7 數據類型默認的值
11.8 數據類型的存儲需要
11.9 對一個字段選擇一個正確的數據類型
11.10 使用來自其他數據庫引擎的數據類型
mysql 支持若干種類的多種數據類型:數字,日期和時間,字符串類型(character and byte),空間類型,json類型。這個章節體提供了對這些數據類型的概述,更加詳細的描述這些類型的屬性在各個對應的目錄。也提供了數據類型的存儲需要的摘要。最開始的概述是有意簡短的。對特定數據類型其他的信息將在這個章節的后面做更加詳細的描述討論。例如,你可以指定的值的允許格式。
數據類型的描述使用這些慣例:
1.對 integer 類型,M代表最大的展示寬帶,對浮動和固定類型,M代表了數字能被儲存的數量(精度)。對字符串類型,M是最大的長度。M最大允許的值根據數據類型的不同而不同。
2. D被應用于浮動 和 固定類型。用于指定小數點后面位數。最大的可能的值是30,但是不會大于M-2
3.fsp應用于
4. 方括號( [ 和 ] ) 表示類型定義可以選擇的部分。
11.1 數據類型 概況
11.1.1 數字類型概述
11.1.2日期和時間類型概述
11.1.3 字符串類型概述
11.1.1 數字類型概述
下面是對數字類型的概述。其他額外的關于數字類型屬性和存儲需要的信息,見章節 11.2數字類型和章節 11.8 數據類型的存儲需要。
對 整數 類型而言,M 表示最大展示寬度。這最大寬度是255. 展示寬度 同一個類型的值能存儲的范圍不相關,相關描述見 章節11.2數字類型
對浮動和固定類型,M代表了數字能被儲存的數量
如果你指定一個字段ZEROFILL,mysql會自動添加UNSIGNED 屬性給該字段
數字類型允許UNSIGNED 屬性,也允許SIGNED。但是 數據類型默認 是 signed,所以 設置 signed 類型是沒有效果的。
SERIAL 是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.的別名
SERIAL 在一個整數字段中 的默認值 是 NOT NULL AUTO_INCREMENT UNIQUE. 的別名
警告
當你使用2個整數類型的值相減而且 其中一個是 UNSIGNED 類型的,那么值也是 UNSIGNED ,除非 NO_UNSIGNED_SUBTRACTION 模式被啟用。見章節 12.10 計算功能和操作
BIT[(M)]
A bit-value type. M indicates the number of bits per value, from 1 to 64. The default is 1 if M is omitted.
一個非常小的整數,signed 的范圍是 -128到 127 ,unsigned 范圍是0到255
這些類型可以考慮為TINYINT(1) 的同義詞。0被認為false,不是0的值被認為true;
mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false |
+------------------------+
mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true |
+------------------------+
mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true |
+------------------------+
但是 TRUE 和 FALSE 僅僅只是 1 和 0 各自的同義詞,例如下面的展示的
mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true |
+--------------------------------+
mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true |
+-------------------------------+
mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false |
+-------------------------------+
mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false |
+--------------------------------+
最后2個語句展示的結構表明2 既不等于1,也不等于0
(實際測試 0認為是 fasle.1認為是 true,其他 如 -1 ,2等 既不被認為是 true 也不被認為是 false ,該結果同數據類型無關 int(2) ,TINYINT(2) 也是如此測試結果 )
一個小的整數,signed 的范圍是 -32768 到 32767,unsigned 范圍是0到65535
一個中等大小的整數,signed的范圍是 -8388608 到 8388607,unsigned 范圍是0到16777215
ef="https://dev.mysql.com/doc/refman/5.7/en/integer-types.html">INT[(M)] [UNSIGNED] [ZEROFILL]
一個普通大小的整數,signed的范圍是 -2147483648 到 2147483647,unsigned 范圍是0到4294967295
int的同義詞
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
一個大的整數。signed 的范圍是 -9223372036854775808 到 223372036854775807.。unsigned范圍是0到18446744073709551615。
SERIAL 是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的同義詞
有些關于事情你應該知道。
.
1.所有的運算時使用signed 的 BIGINT 或者 DOUBLE 值,所以,除了bit function 以外,你不應該使用 unsigned 的大的超過 9223372036854775807 的整數。如果你那樣做,有些結果的最后的數字可能會出錯,因為當一個BIGINT 類型的值 轉換為 DOUBLE 類型時,產生舍入錯誤。
mysql能在下面的事例中處理BIGINT
1.1 當使用 整數保存大的unsigned 值到一個 BIGINT 字段中時。
1.2 在 MIN(col_name)或者 MAX(col_name) 中,這里 col_name 引用 一個 BIGINT 字段
1.3 當使用運算符(+,-,*,等等)2邊都是整數時。
2.你也可以使用儲存字符串的方式,儲存一個精確的整數值到一個 BIGINT 字段。因為,mysql執行字符串到數字的轉換,無中間雙精度表示。
3.當2邊都是整數形式時, +,-,*運算使用BIGINT來進行運算。這時,如果你使用2個大的整數進行乘法運算(或者functions 的返回的結果時整數),當結果大于9223372036854775807 時,你可能會達到出乎意料的結果。
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
一個精確的固定的數。M表示全部的數字的位數(精度),D表示了小數點后面的數字的位數(比例)。小數點和 – 沒有被計算到M中,如果D等于0,代表沒有小數位。最大的M對DECIMAL 而言是65。最大的支持的D為30.如果D不指定,默認為0,如果M不指定默認為10
UNSIGNED 如果你指定,表示不允許負數。
所有具有十進制列的基本計算(+,-,*,/)都是以65位的精度完成的。
DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
這個類型是DECIMAL的同義詞。 FIXED 是為了同其他類型的數據庫兼容。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
一個小的浮動小數(單精度)。允許的值為 -3.402823466E+38 到 -1.175494351E-38,0,和
1.175494351E-38 t 到 3.402823466E+38. 這些是依據IEEE標準, 理論上的限制 。根據你的硬件或者操作系統,實際的范圍可能會微微小于這個值
M表示全部的數字的位數,,D表示了小數點后面的數字的位數。如果 M和 D沒有提交,儲存的位數的限制依賴硬件。一個單精度浮動數大約的精確度是7位。
FLOAT(M,D) 是一個不 標準的mysql擴展
UNSIGNED 如果你指定,表示不允許負數。
使用FLOAT可能給一些不可預料的問題,因為所以在mysql的計算使用 double 精度。見章節 Section B.4.4.7, “Solving Problems with No Matching Rows”.
FLOAT(p) [UNSIGNED] [ZEROFILL]
A floating-point number. p represents the precision in bits, but MySQL uses this value only to determine whether to use FLOAT or DOUBLE for the resulting data type. If p is from 0 to 24, the data type becomes FLOAT with no M or D values. If p is from 25 to 53, the data type becomes DOUBLE with no M or D values. The range of the resulting column is the same as for the single-precision FLOAT or double-precision DOUBLE data types described earlier in this section.
FLOAT(p) syntax is provided for ODBC compatibility.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
一個正常大小的浮動位小數(雙精度)。允許的值為 -1.7976931348623157E+308 到 -2.2250738585072014E-308,0,和2.2250738585072014E-308到 1.7976931348623157E+308。這些是依據IEEE標準, 理論上的限制 。根據你的硬件或者操作系統,實際的范圍可能會微微小于這個值
M表示全部的數字的位數,,D表示了小數點后面的數字的位數。如果 M和 D沒有提交,儲存的位數的限制依賴硬件。一個雙精度浮動數大約的精確度是15位。
DOUBLE[(M,D)] 是一個不 標準的mysql擴展
UNSIGNED 如果你指定,表示不允許負數
These types are synonyms for DOUBLE. Exception: If the REAL_AS_FLOAT SQL mode is enabled, REAL is a synonym for FLOAT rather than DOUBLE.
11.1.2 日期和時間類型概述
下面是對時間類型的概述。其他額外的關于數字類型屬性和存儲需要的信息,見章節 11.3日期和時間類型 和章節 11.8 數據類型的存儲需要。關于更多的操作時間值的函數的描述見 章節 12.7 日期和時間的函數
對 DATE 和DATETIME 類型范圍的描述,” supported” 意味著雖然較早的值可能工作,但是無法保證
mysql對TIME, DATETIME, TIMESTAMP字段允許微秒,使用微秒精度(6位).為了定義一個包括微秒的字段, 使用語法type_name(fsp),這里的type_name 為TIME, DATETIME, 或者 TIMESTAMP,fsp 為微秒.例如
CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
fsp 的值,如果提供,長度必須在0到6位。0表示這里沒有微秒,如果忽略,默認的精度為0(這里同標準的sql默認為6不同,這是為兼容以前的mysql版本)
任何 在一個表中的TIMESTAMP 或者 DATETIME 字段 能自動初始化和自動更新
date類型。支持的范圍為 1000-01-01 到 9999-12-31 。Mysql 展示date類型 使用 YYYY-MM-DD 格式,但是允許指定date 字段 使用 字符串 或者 數字
日期和時間的組合,支持的范圍為1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999。mysql展示 DATETIME 的值使用 YYYY-MM-DD hh:mm:ss[.fraction] 格式,但是允許指定DATETIME 字段 使用 字符串 或者 數字。
可選的參數fsp,長度可能在0到6位用于指定微秒的精度。0表示這里沒有微秒,如果忽略,默認的精度為0
自動初始化和更新當前的日期和時間字段 可以使用 DEFAULT 和 ON UPDATE 字段定義 語句,相關描述見章節哎11.3.5 TIMESTAMP 和DATETIME 字段的 自動初始化和更新 。
一個時間戳。支持的范圍為1970-01-01 00:00:01.000000 UTC到'2038-01-19 03:14:07.999999' UTC. TIMESTAMP 使用從1970-01-01 00:00:00' UTC開始的秒的數量來儲存。TIMESTAMP 不能表示1970-01-01 00:00:00' ,因為 這等同于 從這時間開始的0秒,而0秒已經保留下來用于代表 '0000-00-00 00:00:00 ,zero 時間戳的值。
可選的參數fsp,長度可能在0到6位用于指定微秒的精度。0表示這里沒有微秒,如果忽略,默認的精度為0
服務處理TIMESTAMP 定義的方式依賴explicit_defaults_for_timestamp 系統變量的值(見章節 5.1.7 服務器系統變量)
如果explicit_defaults_for_timestamp 被啟用,DEFAULT CURRENT_TIMESTAMP or ON UPDATE CURRENT_TIMESTAMPattributes 自動的賦值將不能應用于任何的TIMESTAMP 字段。他們必須包括在明確的字段定義中,沒有明確聲明NOT NULL的TIMESTAMP 都允許NULL。
Unless specified otherwise, the first TIMESTAMP column in a table is defined to be automatically set to the date and time of the most recent modification if not explicitly assigned a value. This makes TIMESTAMP useful for recording the timestamp of an INSERT or UPDATE operation. You can also set any TIMESTAMP column to the current date and time by assigning it a NULL value, unless it has been defined with the NULL attribute to permit NULL values.
Automatic initialization and updating to the current date and time can be specified using DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP column definition clauses. By default, the first TIMESTAMP column has these properties, as previously noted. However, any TIMESTAMP column in a table can be defined to have these properties.
TIME[(fsp)]
時間,范圍為 -838:59:59.000000 到 838:59:59.000000。mysql使用 TIME 字段使用 hh:mm:ss[.fraction] 格式,但是允許指定time字段 使用 字符串 或者 數字
可選的參數fsp,長度可能在0到6位用于指定微秒的精度。0表示這里沒有微秒,如果忽略,默認的精度為0
年使用4位的格式。mysql展示 YEAR 使用 YYYY格式,但是允許指定 YEAR字段的值使用字符串或者數字,值展示如 1901 , 2155, 或者0000.
注意
關于其他的關于YEAR展示格式和輸入值的說明,見章節11.3.3, “The YEAR Type”.
SUM() 和 AVG()聚集函數不能在時間字段中工作。(他們會轉換值為數字,同時丟失掉任何的非數字的特性)。圍繞這問題,把時間字段轉換為數字,執行聚合函數,然后再轉換為時間字段。 例如
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
注意
Mysql服務能在MAXDB sql模式中運行。這時,TIMESTAMP等同于 DATETIME. 。如果該模式被啟用,TIMESTAMP 創造 等同于創造DATETIME 字段。作為一個結果,這樣的字段使用DATETIME 的展示格式,擁有一樣的范圍,不能自動的初始化和更新當前的日期和時間,見章節 5.1.10, “Server SQL Modes”
注意
MySQL 5.7.22 中MAXDB 是反對的。同時將會在以后的mysql版本中移除。
總結
以上是生活随笔為你收集整理的mac11.14 mysql_mysql 5.7 11 章 数据类型(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java整形怎么转字符串型_java整型
- 下一篇: java读取pi_(树莓派csi相机)使