国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL 4.1.0 中文參考手冊 --- 6.2 列類型

2024-07-24 12:54:50
字體:
來源:轉載
供稿:網友
mysql 4.1.0 中文參考手冊 --- 犬犬(心帆)翻譯 mysql reference manual for version 4.1.0-alpha.

6.2 列類型


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 解決沒有匹配行的問題。該句法是為了 odbc 兼容而提供的。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.2 datetime、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.2 datetime、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.2 datetime、date 和 timestamp 類型。time一個時間。范圍是 '-838:59:59' 到 '838:59:59'。mysql 以 'hh:mm:ss' 格式顯示 time 值,但是允許你使用字符串或數字來給 time 列賦值。查看章節 6.2.2.3 time 類型。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.4 year 類型。[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.1 char 和 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.1 char 和 varchar 類型。tinyblobtinytext一個 blob 或 text 列,最大長度為 255 (2^8 - 1) 個字符。查看章節 6.5.3.1 隱式的列定義變化。查看章節 6.2.3.2 blob 和 text 類型。blobtext一個 blob 或 text 列,最大長度為 65535 (2^16 - 1) 個字符。查看章節 6.5.3.1 隱式的列定義變化。查看章節 6.2.3.2 blob 和 text 類型。mediumblobmediumtext一個 blob 或 text 列,最大長度為 16777215 (2^24 - 1) 個字符。查看章節 6.5.3.1 隱式的列定義變化。查看章節 6.2.3.2 blob 和 text 類型。longbloblongtext一個 blob 或 text 列,最大長度為 4294967295 (2^32 - 1) 個字符。查看章節 6.5.3.1 隱式的列定義變化。注意,由于服務器/客戶端的協議以及 myisam 表通常有一個 16m 每通信包/表行的限制,你仍然不能使用這個類型的整個范圍。查看章節 6.2.3.2 blob 和 text 類型。enum('value1','value2',...)一個枚舉類型。一個僅能有一個值的字符串對象,這個值選自值列 'value1'、'value2'、...、null 或特殊的 "" 出錯值。一個 enum 列可以有最大 65535 不同的值。查看章節 6.2.3.3 enum 類型。set('value1','value2',...)一個集合。一個能有零個或更多個值的字符串對象,其中每個值必須選自值列'value1'、'value2'、...。一個 set 列可以有最大 64 個成員。查看章節 6.2.3.4 set 類型。6.2.1 數字類型
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)decimal(4, 1) -9.9 到 99.9 -999.9 到 9999.9decimal(5, 1) -99.9 到 999.9 -9999.9 到 99999.9decimal(6, 1) -999.9 到 9999.9 -99999.9 到 999999.9decimal(6, 2) -99.99 到 999.99 -9999.99 到 99999.99decimal(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 列被賦與一個大小超過指定(或缺省)的 precision and scale 的限止范圍時,mysql 以該列范圍的端點值存儲該值。
示例(譯者注):
mysql> create table `ta` ( -> `id` int(4) unsigned zerofill not null, -> `salary` decimal(5,2), -> primary key (`id`) -> ) type=myisam;query ok, 0 rows affected (0.00 sec)mysql> insert into `ta` (`id`, `salary`) -> values (1, -99.99), # 以數字方式插入 -> (2, "99.99"), # 以字符串方式插入 -> (3, -999.99), -> (4, "9999.99"), -> (5, -1000.00), # decimal(5,2)最小范圍為 -999.99 該值插入時結果為 -999.99 -> (6, "10000.00"), # decimal(5,2)最大范圍為 9999.99 該值插入時結果為 9999.99 -> (7, "-99.999"), # 小數位數超過 scale 指定值,但因以字符串方式插入,結果值僅截去多余部分 -> (8, "99.9999"), -> (9, -99.999), # 小數位數超過 scale 指定值,對該值進行四舍五入,結果為 -100.00 -> (10,99.9999);query ok, 10 rows affected (0.00 sec)records: 10 duplicates: 0 warnings: 4mysql> select * from `ta`;+------+---------+| id | salary |+------+---------+| 0001 | -99.99 || 0002 | 99.99 || 0003 | -999.99 || 0004 | 9999.99 || 0005 | -999.99 || 0006 | 9999.99 || 0007 | -99.99 || 0008 | 99.99 || 0009 | -100.00 || 0010 | 100.00 |+------+---------+10 rows in set (0.00 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注)
作為對 ansi/iso sql92 標準的一個擴展,mysql 也支持上面的表格所列出的整型類型 tinyint、mediumint 和 bigint。另外一個擴展是 mysql 支持隨意指定一個整型數值的顯示格式,這通過在類型的基本關鍵詞后跟一個括號來實現(例如 int(4))。這個可選的寬度規格說明是用于在數值顯示時,對某些值的寬度短于該列寬度的值進行左填補顯示的,而不是為了限制在該列中存儲值的寬度,也不是為了限制那些超過該列指定寬度的值的可被顯示的數字位數。當與可選的擴展屬性 zerofill 一起使用時,缺省填補用的空格被零代替。舉例來說,一個列被定義為 int(5) zerofill,插入的值 4 被檢索出來時為 00004。注意,如果在一個整型列中存儲一個超過顯示寬度的更大值時,當 mysql 為某些復雜的聯結(join)生成臨時表時,你可能會遇到問題,因為在這種情況下,mysql 信任地認為所有的值均適合原始的列寬度。
示例(譯者注):
mysql> create table `ta` ( -> `id` int(4) unsigned zerofill not null, -> primary key (`id`) -> ) type=myisam;query ok, 0 rows affected (0.00 sec)mysql> insert into `ta` (`id`) -> values (1),(12),(1234),(12345678);query ok, 4 rows affected (0.01 sec)records: 4 duplicates: 0 warnings: 0mysql> select * from `ta`;+----------+| id |+----------+| 0001 || 0012 || 1234 || 12345678 |+----------+4 rows in set (0.00 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注)
所有的整型類型可以有一個可選(非標準的)屬性 unsigned。如果希望在一個列中只允許正值并且需要一個稍大一點的數字范圍,就可以使用無符號值。

從 mysql 4.0.2 開始,浮點類型也可以存在 unsigned。與整型類型一致的,這個屬性可以防止在該列中存在負值。而與整型類型不一致的,該列的高部范圍仍然與原范圍保持一致。

float 類型被用于表示近似數字的數值類型。ansi/iso sql92 標準允許一個可選的精度說明(但不是指數的范圍),跟在 關鍵詞 float 后的括號內。mysql 實現也支持這個可選的精度規格說明。當關鍵詞被用于一個列的類型說明而沒有精度規格說明時,mysql 使用四個字節來存儲該字段值。在關鍵詞 float 后的括號里給出兩個數字,這種變形的句法也是被支持的。使用這個選項時,第一個數字繼續表示值存儲所占的字節數,第二個數字指定能被存儲和顯示的跟隨在小數點后的位數(就像 decimal 和 numeric)。當 mysql 被要求為這樣的一個列存儲一個小數點后的小數位數超過指定值的數值時,該值將會被四舍五入,去除額外的位。
示例(譯者注):
mysql> create table `ta` ( -> `id` int(4) unsigned zerofill not null, -> `float_date` float(4,2) unsigned not null, -> primary key (`id`) -> ) type=myisam;query ok, 0 rows affected (0.00 sec)mysql> insert into `ta` (`id`,`float_date`) -> values (1, -100), # 插入無效的負值 -> (2, 100.99), # 以數字方式插入 -> (3, "100.99"), # 以字符串方式插入 -> (4, "100.99999"), # 小數位數超過指定倍數,該值進行四舍五入 -> (5, 100.99999), -> (6, "100.9911"), -> (7, 100.9911);query ok, 7 rows affected (0.00 sec)records: 7 duplicates: 0 warnings: 1mysql> select * from `ta`;+------+------------+| id | float_date |+------+------------+| 0001 | 0.00 || 0002 | 100.99 || 0003 | 100.99 || 0004 | 101.00 || 0005 | 101.00 || 0006 | 100.99 || 0007 | 100.99 |+------+------------+7 rows in set (0.00 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注)
real 和 double precision 類型不接受精度規格說明。作為對 ansi/iso sql92 標準的擴展,mysql 接受 double 作為 double precision 類型的一個同義詞。標準要求 real 的精度比用于 double precision 的更小,而與之相反的,mysql 以 8 字節的雙精度浮點值(當不以“ansi 模式”運行時)來實現兩者。為了得到最大的可移植性, 近似數字的數值存儲所需代碼應該使用沒有精度或小數位數規格說明的 float 或 double precision 類型。

當試圖在一個數字列中存儲一個超過該列允許范圍的值時,mysql 會剪切該值到范圍內的適當端點值,并以結果值代替存儲。

舉例來說,一個整型列的范圍是 -2147483648 到 2147483647。如果試圖在一個 int 列中插入值 -9999999999,該值將會被剪切到該范圍的低部端點,以 -2147483648 代替存儲。同樣的,如果試圖插入 9999999999,2147483647 將被代替存儲。

如果 int 列是 unsigned的,列的范圍大小是一致的,不過它的端點移動到了 0 和 4294967295。如果你試圖存儲 -9999999999 和 9999999999,而實際列中存儲的值將會變成 0 和 4294967296。

對于 alter table、load data infile、update 和多行 insert 語句,由于剪切發生的轉換,將以“warnings”被報告。
類型 占用字節 從 到tinyint 1 -128 127smallint 2 -32768 32767mediumint 3 -8388608 8388607int 4 -2147483648 2147483647bigint 8 -9223372036854775808 92233720368547758076.2.2 date 和 time 類型


日期和時間類型有 datetime、date、timestamp、time 和 year。每一個類型均有合法值的范圍,當給它們賦于一個真正不合法的值時,這些值將會被“零”代替。注意,mysql 允許存儲某個“不嚴格地”合法的日期,例如 1999-11-31。這樣做的原因是,我們認為應用程序有責任來處理日期合法性的檢查,而不是由 sql 服務器來處理。為了“加快”對日期的檢查,mysql 僅檢查月份應在 0-12 范圍內,以及天在 0-31 范圍內。因為上面所述的范圍定義方式,mysql 因而允許你在一個 date 或 datetime 列中存儲日或月日均為 0 的日期。當一個應用程序希望存儲一個出生日期,而你并不知準確的出生日月時,這將變得非常有用。在這種情況下,你可以簡單地以 1999-00-00 或 1999-01-00 形式存儲日期。(當然你不能期望 date_sub() 或 date_add 之類的函數能正確地處理這樣的日期,并得到正確的值。)

當使用日期和時間類型工作時,這里有一些要記住的總則:
mysql 對一個給定的日期或時間類型以標準的格式進行檢索,但是它會努力以各種格式匹配解釋你所提供的(例如,當你指定一個值,將其賦給一個日期或時間類型或與之比較時)。然而,只在下面部分所描述的格式是被支持的。期望你能夠提供合法的值,如果你使用其它格式的值,可能會造成無法預料的結果。盡管 mysql 會嘗試以各種格式解釋值,它通常期望日期的年部分放在最左邊。日期必須以年-月-日次序給出(例如, '98-09-04'),而不是其它地方常用的月-日-年或日-月-年次序(例如,'09-04-98'、'04-09-98')。如果一個值被用于在數字的語境中,mysql 將自動地將一個日期或時間類型值轉換成數字,反之亦然。當 mysql 遇到一個日期或時間類型的值超出范圍或對該類型是一個不合法的值時(查看這個章節的開頭部分),它會將該類型的值變換到“零”值。(例外的是超出范圍的 time 值將被剪切為適當的 time 范圍端點值。) 下表每種類型的“零”值格式:列類型 “零”值 datetime '0000-00-00 00:00:00'date '0000-00-00'timestamp 00000000000000 (長度取決于顯示格式)time '00:00:00'year 0000“零”值是特殊的,但是你可以以表中顯示的值來明確地存儲或引用他們。你也可以使用值'0' 或 0,這更易于書寫。在 myodbc 2.50.12 和以上的版本中,“零”值的日期和時間值通過 myodbc 將被自動轉換成 null,因為 odbc 不能夠處理這樣的值。6.2.2.1 y2k 問題和日期類型


mysql 自身是 y2k 安全的(查看章節 1.2.5 2000 年兼容性),但是呈交給 mysql 的值可能并不是。任何一個包含 2 位年份的值是存在二義性的,因為世紀值是未知的。這樣的值必須被解釋為 4 位格式,因為 mysql 內部使用四位存儲年份。

對于 datetime、date、timestamp 和 year 類型,mysql 使用下列規則解釋存在二義性的年份值:
在范圍 00-69 內的年值被轉換為 2000-2069。在范圍y 70-99 內的年值被轉換為 1970-1999。
記住,這些規則僅僅提供對于你的數據含義的合理猜測。如果 mysql 使用的探索法無法得到正確的值,你應該以包含 4 位年份的格式提供一個明確的值。

order by 將以適當的順序對 2 位 year/date/datetime 類型排序。

注意,某些像 min() 和 max() 之類的函數會將 timestamp/date 轉換為一個數字。這就意味著,一個 2 位年份的時間戳將完全不能與這些函數一同工作。在這種情況下,解決的辦法是將 timestamp/date 轉換為 4 位年份格式或者使用諸如 min(date_add(timestamp,interval 0 days)) 的方法。
6.2.2.2 datetime、date 和 timestamp 類型


datetime、date 和 timestamp 類型是相似的。這個章節描述了它們的特性以及它們的相似點與不同點。

datetime 類型可用于需要同時包含日期和時間信息的值。mysql 以 'yyyy-mm-dd hh:mm:ss' 格式檢索與顯示 datetime 類型。支持的范圍是 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。(“支持”的含義是,盡管更早的值可能工作,但不能保證他們均可以。)

date 類型可用于需要一個日期值而不需要時間部分時。mysql 以 'yyyy-mm-dd' 格式檢索與顯示 date 值。支持的范圍是 '1000-01-01' 到 '9999-12-31'。

timestamp 列類型提供了一種類型,通過它你可以以當前操作的日期和時間自動地標記 insert 或update 操作。如果一張表中有多個 timestamp 列,只有第一個被自動更新。

自動更新第一個 timestamp 列在下列任何條件下發生:
列值沒有明確地在一個 insert 或 load data infile 語句中被指定。列值沒有明確地在一個 update 語句中被指定,并且其它的一些列值已發生改變。(注意,當一個 update 設置一個列值為它原有值時,這將不會引起 timestamp 列的更新,因為,如果你設置一個列值為它當前值時,mysql 為了效率為忽略更新。)明確地以 null 設置 timestamp 列。
第一個列以外其它 timestamp 列,可以設置到當前的日期和時間,只要將該列賦值 null 或 now()。

任何 timestamp 列均可以被設置一個不同于當前操作日期與時間的值,這通過為該列明確指定一個你所期望的值來實現。這也適用于第一個 timestamp 列。這個選擇性是很有用的,舉例來說,當你希望 timestamp 列保存該記錄行被新添加時的當前的日期和時間,但該值不再發生改變,無論以后是否對該記錄行進行過更新:
當該記錄行被建立時,讓 mysql 設置該列值。這將初始化該列為當前日期和時間。以后當你對該記錄行的其它列執行更新時,為 timestamp 列值明確地指定為它原來的值。
另一方面,你可能發現更容易的方法,使用 datetime 列,當新建記錄行時以 now() 初始化該列,以后在對該記錄行進行更新時不再處理它。

示例(譯者注):
mysql> create table `ta` ( -> `id` int(3) unsigned not null auto_increment, -> `date1` timestamp(14) not null, -> `date2` timestamp(14) not null, -> primary key (`id`) -> ) type=myisam;query ok, 0 rows affected (0.01 sec)mysql> insert into `ta` set `id` = 1; query ok, 1 row affected (0.02 sec)# 沒有明確地指定第一個 timestamp 列值,該列值被設為插入的當前時刻# 沒有明確地指定其它的 timestamp 列值,mysql 則認為插入的是一個非法值,而該列值被設為0mysql> insert into `ta` values (2, now(), null);query ok, 1 row affected (0.01 sec)mysql> select * from `ta`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 1 | 20030503104118 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)mysql> update `ta` set `id` = 3 where `id` = 1;query ok, 1 row affected (0.01 sec)rows matched: 1 changed: 1 warnings: 0# 對某一記錄行進行了更新,第一個 timestamp 列值也將被更新mysql> update `ta` set `id` = 2 where `id` = 2;query ok, 0 rows affected (0.00 sec)rows matched: 1 changed: 0 warnings: 0# mysql 忽略了這次操作,第一個 timestamp 列值不會被更新mysql> select * from `ta`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 3 | 20030503104538 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)mysql> update `ta` set `id` = 1,`date1`=`date1` where `id` = 3;query ok, 1 row affected (0.00 sec)rows matched: 1 changed: 1 warnings: 0# 明確地指定了第一個 timestamp 列值為它原有值,該值將不會被更新mysql> select * from `ta`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 1 | 20030503104538 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注)


timestamp 值可以從 1970 到 2037 之間的任一時刻,精度為一秒。其值作為數字顯示。

mysql 檢索與顯示 timestamp 值的格式取決于它的顯示尺寸,描述如下表。“完整”的 timestamp 格式是 14 位的,但是 timestamp 列可以以一個更短的顯示尺寸建立:
列類型 顯示格式 timestamp(14) yyyymmddhhmmsstimestamp(12) yymmddhhmmsstimestamp(10) yymmddhhmmtimestamp(8) yyyymmddtimestamp(6) yymmddtimestamp(4) yymmtimestamp(2) yy
所有的 timestamp 列均有一個相同的存儲尺寸,而不考慮顯示尺寸的大小。最常見的顯示尺寸為 6、8、12 和 14。你可以在表創建時指定一個任意的顯示尺寸,但是值 0 或 比 14 大的值將會被強制定義為列長 14。在從 1 ~ 13 范圍內的奇數會被強制為下一個更大的偶數。

例如(譯者注):字段定義 強制字段長度 timestamp(0) timestamp(14) timestamp(15) timestamp(14) timestamp(1) timestamp(2) timestamp(5) timestamp(6)


注意:從 mysql 4.1 開始,timestamp 以 'yyyy-mm-dd hh:mm:dd' 格式作為字符串返回。不同的時間戳長度不再被支持。

譯者注:如果你你希望在 mysql 4.1 中以數字形式返回時間戳,則必須在該時間戳字段后加上 +0。從 mysql 4.0.12 開始,選項 --new 可以被用來使服務器與 4.1 一樣運作。

你可以使用常用的格式集中的任何一個指定 datetime、date 和 timestamp 值:
一個 'yyyy-mm-dd hh:mm:ss' 或 'yy-mm-dd hh:mm:ss' 格式的字符串。一個“寬松”的語法是被允許的:以任何標點符號作為日期部分和時間部分中的定界符。例如,'98-12-31 11:30:45'、'98.12.31 1+30+45'、'98/12/31 11*30*45' 和 '[email protected]@31 11^30^45' 均是等價的。一個 'yyyy-mm-dd' 或 'yy-mm-dd' 格式的字符串。這里,一個“寬松”的語法同樣也是被允許的:例如,'98.12.31'、'98-12-31'、'98/12/31' 和 '[email protected]@31' 是等價的。一個無定界符的 'yyyymmddhhmmss' 或 'yymmddhhmmss' 格式的字符串,只要字符串看起來像是一個日期。例如,'19970523091528' 和 '970523091528' 均被解釋為 '1997-05-23 09:15:28',但是 '971122129015' 卻是違法的(它的分部分是無意義的),該值被插入時將變成 '0000-00-00 00:00:00'。一個無定界符的 'yyyymmdd' 或 'yymmdd' 格式的字符串,只要字符串看起來像是一個日期。例如,'19970523' 和 '970523' 被解釋成為 '1997-05-23',但是 '971332' 卻是違法的(它的月和日部分是無意義的),該值被插入時將變成 '0000-00-00'。一個 yyyymmddhhmmss 或 yymmddhhmmss 格式的數字,只要數字看起來像是一個日期。例如,19830905132800 和 830905132800 被解釋成為 '1983-09-05 13:28:00'。一個 yyyymmdd 或 yymmdd 格式的數字,只要數字看起來像是一個日期。例如,19830905 和 830905 被解釋成為 '1983-09-05'。在一個 datetime、date 或 timestamp 語境中,一個函數的返回值將隨之而變化,例如 now() 或 current_date。
非法的 datetime、date 或 timestamp 值將會被轉換到適當形式的“零”值('0000-00-00 00:00:00'、'0000-00-00' 或 00000000000000)。

對于以字符串格式指定的包含日期定界符的值,不必要為小于 10 的月或天的值指定 2 位數字。'1979-6-9' 等同于 '1979-06-09'。同樣的,對于以字符串指定的包含時間定界符的值,不必要為小于 10 的時、分或秒指定 2 位數字。'1979-10-30 1:2:3' 等同于 '1979-10-30 01:02:03'。

以數字指定的值應該是 6、8、12 或 14 位長。如果數字是 8 或 14 位長的,該值將被假定為年份是由頭 4 位數字給出的 yyyymmdd 或 yyyymmddhhmmss 格式。如果數字是 6 或 12 數字長,它將被假定為年份是由頭 2 位數字給出的 yymmdd 或 yymmddhhmmss 格式。不是這些長度之一的數字通過在值前補零到最接近的長度后解釋。

以沒有定界符的字符串格式指定的值通過它們給出的長度來解釋。如果字符串是 8 或 14 個字符長,則假定年份由前 4 個字符給出。否則,年份由前 2 個字符給出。對于字符串中出現的多個部分,字符串以從左到右的順序被解釋,以找出年、月、日、時、分和秒值。這就意味著,你不就使用少于 6 個字符的字符串。例如,如果指定 '9903' ,你可能認為它代表 1999年3月,但你將會發現mysql 會將一個“零”值插入到你的表中。這是因為,年份和月份分別為 99 和 03,但是日期部分丟失(為 0),因此這個值是不合法的。

timestamp 列總是以完全精度存儲給定的合法值,而不考慮顯示尺寸的大小。這包含幾個含義:
賦值時總是給出年、月和日,即使你的列類型定義為 timestamp(4) 或 timestamp(2)。否則,該值將是不合法的,而被 0 代替存儲。
示例(譯者注):
mysql> create table `ta` ( -> `id` int(3) unsigned not null auto_increment, -> `date1` timestamp(4) not null, -> primary key (`id`) -> ) type=myisam;query ok, 0 rows affected (0.01 sec)mysql> insert into `ta` (`id`,`date1`) -> values (1,null), # 插入當前日期和時間 -> (2,0305), # 以數字格式給出值,而值長度小于 6 ,在最左邊補 0 至 6 位數字 -> (3,'0305');# 以字符串格式給出值,而值長不包括年、月和日,因而是一個非法值query ok, 3 rows affected (0.01 sec)records: 3 duplicates: 0 warnings: 1mysql> select * from `ta`;+----+-------+| id | date1 |+----+-------+| 1 | 0305 || 2 | 0003 || 3 | 0000 |+----+-------+3 rows in set (0.00 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注)

如果以 alter table 拓展一個 timestamp 窄列,以前被“隱蔽”的信息將被顯示出來。
示例(譯者注):
* 接上例結果mysql> alter table `ta` change `date1` `date1` timestamp(11);query ok, 3 rows affected (0.01 sec)records: 3 duplicates: 0 warnings: 0# 設置 `date1` 為 timestamp(11),mysql 會自動將其轉化為 timestamp(11)mysql> select * from `ta`;+----+--------------+| id | date1 |+----+--------------+| 1 | 030503150142 || 2 | 000305000000 || 3 | 000000000000 |+----+--------------+3 rows in set (0.00 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注):

同樣的,縮小一個 timestamp 列的寬度不會引起信息的丟失,除了在感覺上值在被顯示時顯示了較少的信息。盡管 timestamp 列值是以全部精度存儲的,但是 unix_timestamp() 是唯一能直接操作內部存儲值的函數。其它的函數操作的是格式化后的檢索的值。這就意味著不能夠使用諸如 hour() 或 second() 之類的函數,除非相關部分存在于格式化后的 timestamp 值中。例如,在小于 10 的顯示格式上,為了使 timestamp 列中的 hh 部分能夠顯示,顯示格式的尺寸必須不小于 10,因此在一個更短的 timestamp 列值上使用 hour() 將會產生一個無意義的結果。
示例(譯者注):
* 接上例結果# 下列示例結果與上述結果相悖mysql> alter table `ta` change `date1` `date1` timestamp(4);query ok, 3 rows affected (0.02 sec)records: 3 duplicates: 0 warnings: 0mysql> select * from `ta`;+----+-------+| id | date1 |+----+-------+| 1 | 0305 || 2 | 0003 || 3 | 0000 |+----+-------+3 rows in set (0.01 sec)mysql> select hour(`date1`) from `ta`;+---------------+| hour(`date1`) |+---------------+| 15 || 0 || null |+---------------+3 rows in set (0.02 sec)mysql> select second(`date1`) from `ta`;+-----------------+| second(`date1`) |+-----------------+| 42 || 0 || null |+-----------------+3 rows in set (0.01 sec)* 以上結果在 mysql 4.0.12 中測試
示例結束(譯者注):


在某種程序上,你可以將一個日期值賦給另一種日期類型的對象。然而,這可能會使值產生改變或丟失一部分信息。
如果將一個 date 值賦給一個 datetime 或 timestamp 對象,結果值的時間部分將被設為 '00:00:00',因為 date 值不包含時間信息。如果將一個 datetime 或 timestamp 值賦給一個 date 對象,結果值的時間部分被刪除,因為 date 類型不能存儲時間信息。記住,盡管 datetime、date 和 timestamp 值全都可以用同樣的格式集來指定,但所有類型不都有同有同樣的值范圍。例如,timestamp 值不能早于 1970 或晚于 2037。這就意味著,一個日期例如 '1968-01-01',作為一個 datetime 或 date 值是合法的,但不是一個有效的 timestamp 值,當它被賦于一個這樣的對象時,它將被轉換為 0。
當指定日期值時,當心某些失誤:
你可能會被以字符串指定值時所允許的寬松格式欺騙。例如,一個值如 '10:11:12' 的,因為分界符 “:” 可能看起來像是一個時間值, 但是當它被用于一個日期語境中時,它將被解釋成為 '2010-11-12' 年。而值 '10:45:15' 將被轉換成 '0000-00-00',因為 '45' 是一個不合法的月份。mysql 服務器僅對日期的有效性執行基本的檢驗:天為 00-31,月為 00-12,年為 1000-9999。任何不是這個范圍內的日期將被轉換為 0000-00-00。請注意,這仍然允許你存儲一個無效的日期例如2002-04-31。它允許一個 web 應用程序不進行進一步的檢查而存儲一個表單中的數據。為了確保一個日期值的有效性,在你的應用程序里執行有效性檢查。以兩位數字指定年份是存在二義性的,因為世紀是未知的。mysql 以下面的規則解釋一個 2 位年份值:00-69 范圍的年份值被轉換為 2000-2069。70-99 范圍的年份值被轉換為 1970-1999。6.2.2.3 time 類型


mysql 以 'hh:mm:ss' 格式(或對大的小時值時使用 'hhh:mm:ss' 格式)檢索和顯示 time 值。time 值的范圍可以從 '-838:59:59' 到 '838:59:59'。小時部分可以這么大的原因 是,time 類型不僅可以用于表示一天的時間(這一定不會超過 24 小時),而且可以用來表示所經過的時間或兩個事件之間的時間間隔(這可能比 24 小時大許多或是一個負值)。

time 值可以多種格式指定:
一個 'd hh:mm:ss.fraction' 格式的字符串。(注意,mysql 仍然不能為時間列存儲毫秒“fraction”)下面所示的任一種“寬松”的語法均可以被使用:hh:mm:ss.fraction、hh:mm:ss、hh:mm、d hh:mm:ss、d hh:mm、d hh 或 ss。這里的 d 是一個在 0-33 之間的日期。一個無定界符的 'hhmmss' 格式的字符串,只要字符串看起來像是一個時間。例如:'101112' 可被理解為 '10:11:12',但是 '109712' 是不合法的(它有一個無意義的分鐘部分),當被插入時會轉換為 '00:00:00'。一個 hhmmss 格式的數字,只要數字看起來像一個時間。例如,101112 可被理解為 '10:11:12'。下面的任一格式均可被正常理解:ss、mmss、hhmmss、hhmmss.fraction。注意,mysql 仍不能保存 毫秒(fraction)部分。在一個 time 語境中,函數(例如 current_time)的返回值將會返一個合理的格式。
對于以字符串指定的包含時間定界符的 time 值,不必要為小于 10 的時、分或秒指定 2 位數字。'8:3:2' 與 '08:03:02' 是一致的。

將“短”的 time 值賦給另一個 time 列時要格外小心。如果沒有冒號,mysql 使用最右位代表秒的假設來解釋值。(mysql 將 time 值解釋為經過的時間,而不是時刻)。例如,你可能會認為 '1112' and 1112 的意思就是 '11:12:00' (11 點過 12 分),但是 mysql 卻將它解釋為 '00:11:12' (11 分,12 秒)。同樣的,'12' 和 12 被解釋為 '00:00:12'。有冒號的 time 值,由于冒號的存在,通常認為是處理過的時刻。這就是說,'11:12' 就意味著是 '11:12:00',而不是 '00:11:12'。

如果值超出了 time 的范圍,但是其它分、秒部分是合法的,它將被剪切到取值范圍的適當端點。例如,'-850:00:00' 和 '850:00:00' 將被分別轉換為 '-838:59:59' 和 '838:59:59'。

不合法的 time 值將被轉換為 '00:00:00'。注意,因為 '00:00:00' 自身是一個合法的 time 值,這就沒有辦法區分,存儲在一個表中的 '00:00:00',原來的值是否就是指定為 '00:00:00' 或是一個不合法的值。
6.2.2.4 year 類型


year 類型是一個以 1 個字節描述年份的類型。

mysql 以 yyyy 格式檢索和顯示一個 year 值。范圍是 1901 到 2155。

可以以多個格式指定 year 值:
一個在 '1901' 到 '2155' 范圍之內的 4 位字符串。一個在 1901 到 2155 范圍之內的 4 位數字。一個在 '00' 到 '99' 范圍之內的 2 位字符串。'00' 到 '69' 和 '70' 到 '99' 范圍內的值將被分別轉換到 2000 到 2069 和 1970 到 1999 范圍內的 year 值。一個在 1 到 99 范圍之內的數字。1 到 69 和 70 到 99 范圍內的值將被分別轉換到 2001 到 2069 和 1970 到 1999 范圍內的 year 值。注意,兩位數字的范圍與兩位字符串的范圍稍稍有點不同,因為你不能直接地以數字指定一個零值,將它解釋為 2000。你必須 以一個 '0' 或 '00' 格式的字符串指定它,否則它將被解釋為 0000。在一個 year 的語境中,函數(例如 now())的返回值將會返回一個合理的格式。
不合法的 year 值將被轉換為 0000。
6.2.3 字符串類型




字符串類型有 char、varchar、blob、text、enum 和 set。這個章節描述這些類型是如何工作的,它們的存儲需求,以及在你的查詢中如何使用它們。
類型 最大尺寸 字節 tinytext 或 tinyblob 2^8-1 255text 或 blob 2^16-1 (64k-1) 65535mediumtext 或 mediumblob 2^24-1 (16m-1) 16777215longblob 2^32-1 (4g-1) 42949672956.2.3.1 char 和 varchar 類型
char 和 varchar 類型是很相似的,但是它們被存儲與檢索的方式有些不同。

一個 char 列的長度被固定為你創建表進所聲明的長度。長度可以是 1 和 255 之間的任一值。(從 mysql 3.23 之后,char 的長度可以是 0 到 255。)當 char 值被存儲時,他們被用空格在右邊填補到指定長度。當 char 值被檢索時,尾部的空格被截除。

varchar 列的值是變長的字符串。你可以聲明一個 varchar 列在 1 到 255, 就像對 char 列一樣。然而,與 char 相反的,varchar 值只以所需的字符數存儲,另加一個字節存儲記錄的長度。值并不被填補;相反的,當被存儲時,尾部的空格被截除。(這個截除空格方式不同于 ansi sql 規約。)

如果將一個超過列最大長度的值賦給一個 char 或 varchar 列,該值將截斷以適合它。

下表通過在 char(4) 和 varchar(4) 列中存儲不同的字符串的結果顯示了兩種類型列的不同:
值 char(4) 存儲需求 varchar(4) 存儲需求 '' ' ' 4 字節 '' 1 字節'ab' 'ab ' 4 字節 'ab' 3 字節'abcd' 'abcd' 4 字節 'abcd' 5 字節'abcdefgh' 'abcd' 4 字節 'abcd' 5 字節
在各種情況下,char(4) 和 varchar(4) 列的檢索值均是一樣的,因為在 char 列上檢索值的尾部空格會被截除。

char 和 varchar 列值以省略字母大小寫的方式進行排序和比較,除非在表建立時 binary 屬性被指定。binary 屬性意味著,該列值根據 mysql 服務器正在運行的機器的 ascii 表順序進行字母大小寫敏感的方式排序和比較。binary 并不影響該列如何被存儲和檢索。

binary 屬性是有粘性的。這就意味著,如果一個被標記為 binary 的列被用于一個表達式中,整個表達式將作為一個 binary 值被比較。

在表創建時,mysql 可能會隱式地改變一個 char 或 varchar 列的類型。查看章節 6.5.3.1 隱式的列定義變化。
6.2.3.2 blob 和 text 類型


一個 blob 是一個可以保存一可變數量的數據的二進制大對象。四個 blob 類型(tinyblob、blob、mediumblob 和 longblob)之間的不同僅僅在于他們能保存值的最大長度不一致。查看章節 6.2.6 列類型存儲需求。

四個 text 類型(tinytext、text、mediumtext 和 longtext)對應與四個 blob 類型,并且有相同的最大長度和存儲需求。在 blob 和 text 類型之間的唯一差別就是,對 blob 值是以字母大小寫敏感的方式進行排序和比較的,而對 text 值以忽略字母大小寫方式進行排序和比較。換句話說,text 是一個忽略字母大小寫的 blob。

如果將一個超過列類型最大長度的值賦給一個 blob 或 text 列,該值將被截斷以適應它。

在大多數方面,可以將一個 text 列看作是一個你所希望大 varchar 列。同樣的,blob 列可以看作是一個 varchar binary 列。差別就在于:
在 mysql 3.23.2 和更新的版本中,可以在 blob 和 text 列上建立索引。而較老版本的 mysql 是不支持的。當 blob and text 列值被存儲時,尾部的空格不會被剪切,這與 varchar 列是不一樣的。blob 和 text 列不可以有 default 值。
myodbc 以 longvarbinary 定義 blob 值,以 longvarchar 定義 text 值。

因為 blob 和 text 值可以非常地長,在使用它們時可能會遇到某些限制:
如果希望在一個 blob 或 text 列上使用 group by 和 order by,必須將該列值轉換為一個定長對象。這樣做的標準做法是使用 substring 函數。例如:
mysql> select comment from tbl_name,substring(comment,20) as substr -> order by substr;
如果你不這樣做,只有列值的前 max_sort_length 個字節用于排序。max_sort_length 缺省的值為 1024;在啟動 mysqld 服務時,可以使用 -o 選項對它進行更改。可以在一個包含 blob 或 text 值的表達式上進行分組,通過指定列的位置或使用一個別名:
mysql> select id,substring(blob_col,1,100) from tbl_name group by 2;mysql> select id,substring(blob_col,1,100) as b from tbl_name group by b;
一個 blob 或 text 對象的最大尺寸由其類型決定,但是在客戶端和服務器之間實際所能傳送的最大值,是由可用內存總數和通訊緩沖區的大小來決定的。你可以改變報文緩沖區的大小,但必須在服務器端與客戶端同時這么做。查看章節 5.5.2 調節服務器參數。
注意,每個 blob 或 text 值在內部由一個獨立分配的對象表示。這與其它所有的列類型不一樣,當表被打開時,它們被按每列分配一次存儲。
6.2.3.3 enum 類型


enum 是一個字符串對象,其值通常選自一個允許值列表中,該列表在表創建時的列規格說明中被明確地列舉。

在下列某些情況下,值也可以是空串("") 或 null:
如果將一個無效值插入一個 enum (即,一個不在允許值列表中的字符串),空字符串將作為一個特殊的錯誤值被插入。事實上,這個字符串有別于一個“普通的”空字符串,因為這個字符串有個數字索引值為 0。稍后有更詳細描述。如果一個 enum 被聲明為 null,null 也是該列的一個合法值,并且該列的缺省值也將為 null。如果一個 enum 被聲明為 not null,該列的缺省值將是該列表所允許值的第一個成員。
每個枚舉值均有一個索引值:
在列說明中列表值所允許的成員值被從 1 開始編號。空字符串錯誤值的索引值為 0。這就意味著,你可以使用下面所示的 select 語句找出被賦于無效 enum 值的記錄行。
mysql> select * from tbl_name where enum_col=0;
null 值的索引值為 null。
例如,指定為 enum("one", "two", "three") 的一個列,可以有下面所顯示的任一值。每個值的索引值也如下所示:
值 索引值 null null"" 0"one" 1"two" 2"three" 3
換個枚舉最大可以有 65535 個成員值。

從 mysql 3.23.51 開始,當表被創建時,enum 值尾部的空格將會自動刪除。

當為一個 enum 列賦值時,字母的大小寫是無關緊要的。然而,以后從列中檢索出來的值的大小寫卻是匹配于創建表時所指定的允許值。

如果在一個數字語境中檢索一個enum,列值的索引值將被返回。例如,你可以像這樣使用數字值檢索一個 enum 列:

mysql> select enum_col+0 from tbl_name;

如果將一個數字存儲到一個 enum 中,數字被當作為一個索引值,并且存儲的值是該索引值所對應的枚舉成員。(但是,這在 load data 將不能工作,因為它視所有的輸入均為字符串。)在一個 enum 字符串中存儲數字是不明智的,因為它可能會打亂思維。

enum 值依照列規格說明中的列表順序進行排序。(換句話說,enum 值依照它們的索引號排序。)舉例來說,對于 enum("a", "b") "a" 排在 "b" 后,但是對于 enum("b", "a") ,"b" 卻排在 "a" 之前。空字符串排在非空字符串前,null 值排在其它所有的枚舉值前。為了防止意想不到的結果,建議依照字母的順序定義 enum 列表。也可以通過使用 group by concat(col) 來確定該以字母順序排序而不是以索引值。

如果希望得到一個 enum 列的所有可能值,可以使用 show columns from table_name like enum_column_name 并分析第二列的 enum 定義。
6.2.3.4 set 類型


set 是一個字符串對象,它可以有 0 或更多個值,每個值均必須選自一個允許值列表中,該列表在表創建時被指定。包含多個集合成員的 set 列值,由逗號(“,”)將各成員分隔。由此推論,set 成員值自身不應該包含逗號。

例如,一個指定為 set("one", "two") not null 的列可以有下列任一值:

"""one""two""one,two"

一個 set 最大可以有 64 個不同的成員。

從 3.23.51 開始,當表被創建時,set 值尾部的空格將被自動地刪除。

mysql 以數字值存儲 set 值,以被存儲值的低階比特位(bit)對應于第一個集合成員。如果在一個數字語境中檢索一個 set 值,檢索的值把比特位設置為對應組成列值的集合成員。例如,你可以使用下面所示的示例從一個 set 列中檢索出一個數字:

mysql> select set_col+0 from tbl_name;

如果將一個數字存儲到一個 set 列中,被設置的數字的二進制表示法的比特位決定列值中的集合成員。假設一個列被定義為 set("a","b","c","d")。那么它的成員有下面所示的比特值:
set 成員 十進制值 二進制值a 1 0001b 2 0010c 4 0100d 8 1000
如果將值 9(二進制的 1001) 賦給這個列,那么 set 值的第一個和第四個成員 "a" 和 "d" 被選擇,結果值為 "a,d"。

對于包含超過一個 set 成員的值,當你插入值時,無所謂以什么順序列出成員。也無所謂給出的值被列舉了多少次。當以后檢索該值時,在值中的每個成員將出現一次,根據他們在表創建時所指定的順序列出成員。例如,如果一個列被定義為 set("a","b","c","d"),那么,"a,d"、"d,a" 和 "d,a,a,d,d" 在被檢索時均將被視為 "a,d"。

如果將一個不支持的值賦于一個 set 列,該值將被忽略。

set 以數字順序排序。null 值排在非 null set 值之前。

通常,可以使用 like 操作符或 find_in_set() 函數執行在一個 set 列上的 select:

mysql> select * from tbl_name where set_col like '%value%';mysql> select * from tbl_name where find_in_set('value',set_col)>0;

但是,下列示例也可以工作:

mysql> select * from tbl_name where set_col = 'val1,val2';mysql> select * from tbl_name where set_col & 1;

第一個語句尋找一個精確的匹配。第二個語句尋找包含第一個集合成員的值。

如果希望得到一個 set 列的所有可能值,可以使用 show columns from table_name like set_column_name 并分析第二列的 set 定義。
6.2.4 為列選擇正確的類型


為了更有效地使用存儲空間,在任何情況下均嘗試使用最精確的類型。例如,如果一個整數列被用于在 1 和 99999 之間的值,mediumint unsigned 是最好的類型。

精確地表示貨幣值是一個常見的問題。在 mysql 中,可以使用 decimal 類型。它是作為一個字符串存儲的,因而不會發生精度損失的情況。如果精度不是太重要的,那 double 類型也是一個不錯的選擇。

對于高精度,總是能轉換一個存儲在 bigint 中的定點類型。這將允許你以整型進行任何的計算,并在必要的時候將結果轉換回浮點值。
6.2.5 使用來自其它的數據庫引擎的列類型


為了更容易地使用為其它供應商的 sql 實現而編寫的代碼,mysql 以下表所示的形式映射列類型。這些映射使得從其它數據庫引擎移動表到 mysql 更容易:
其它提供商的類型 mysql 類型 binary(num) char(num) binarychar varying(num) varchar(num)float4 floatfloat8 doubleint1 tinyintint2 smallintint3 mediumintint4 intint8 bigintlong varbinary mediumbloblong varchar mediumtextmiddleint mediumintvarbinary(num) varchar(num) binary
列類型映射在表創建時發生。如果你使用其它供應商使用的類型創建一個表,然后發出一個 describe tbl_name 語句,mysql 將使用相等價的 mysql 類型報告表結構。
6.2.6 列類型存儲需求


每個由 mysql 支持的列類型的存儲需求按類型在下面列出。


6.2.6.1 數字類型存儲需求列類型 存儲需求 tinyint 1 字節smallint 2 字節mediumint 3 字節int 4 字節integer 4 字節bigint 8 字節float(x) 4 if x <= 24 or 8 ,if 25 <= x <= 53float 4 字節double 8 字節double precision 8 字節real 8 字節decimal(m,d) m+2 字節 if d > 0,m+1 字節 if d = 0 (d+2, if m < d)numeric(m,d) m+2 字節 if d > 0, m+1 字節 if d = 0 (d+2, if m < d)

6.2.6.2 日期和時間類型存儲需求列類型 存儲需求 date 3 字節datetime 8 字節timestamp 4 字節time 3 字節year 1 字節6.2.6.3 字符串類型存儲需求列類型 存儲需求 char(m) m 字節, 1 <= m <= 255varchar(m) l+1 字節, where l <= m and1 <= m <= 255tinyblob, tinytext l+1 字節,where l < 2^8blob, text l+2 字節,where l < 2^16mediumblob, mediumtext l+3 字節,where l < 2^24longblob, longtext l+4 字節,where l < 2^32enum('value1','value2',...) 1 or 2 字節, 取決于枚舉值的數量(最大值為 65535)set('value1','value2',...) 1, 2, 3, 4 or 8 字節, 取決于集合成員數量(最大 64 個成員)
varchar 和 blob 和 text 類型是變長的類型,其存儲需求取決于列值的實際長度(上表中以 l 表示),而不是取決于類型的最大可能尺寸。例如,一個 varchar(10) 列可以保存最大長度為 10 個字符的字符串。實際存儲需求為字符串長度 (l),再加上 1 個字節用于記錄該字符串的長度。對于字符串 'abcd',l 為 4,它的存儲需求為 5 字節。

blob 和 text 類型需要 1、2、3 或 4 字節記錄列值的長度,這取決于該類型的最大可能長度。查看章節 6.2.3.2 blob 和 text 類型。

如果一個表包含任何變長類型的列類型,記錄格式也將是變長的。注意,當一個表被創建時,在某種情況下,mysql 會將一個列從一個變長類型轉換成一個定長類型,或相反的。查看章節 6.5.3.1 隱式的列定義變化。

一個 enum 對象的大小取決于不同枚舉值的數量。一個字節被用于枚舉時,最大可支持 255 個可能值。2 個字節被用于枚舉時,最大可支持到 65535 個值。查看章節 6.2.3.3 enum 類型。

一個 set 對象的大小取決于不同集合成員的數量。如果集合的大小是 n,則對象占用 (n+7)/8 個字節,四舍五入為 1、2、3、4 或 8 個字節。一個 set 可以有最多 64 個成員。查看章節 6.2.3.4 set 類型。

myisam 表的記錄行最大尺寸為 65534 字節。每個 blob 和 text 列只占用相對于這個尺寸中的 5-9 個字節。
 ,歡迎訪問網頁設計愛好者web開發。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平顶山市| 泉州市| 牡丹江市| 托克托县| 饶平县| 瑞金市| 玛曲县| 南陵县| 芒康县| 巫溪县| 靖边县| 合江县| 津南区| 和静县| 淄博市| 兴安盟| 松阳县| 吴堡县| 紫阳县| 乌鲁木齐县| 张家港市| 丹江口市| 临武县| 民县| 南召县| 边坝县| 昌乐县| 土默特右旗| 浙江省| 沐川县| 肃南| 陕西省| 邛崃市| 顺义区| 柏乡县| 和龙市| 依兰县| 松潘县| 黄山市| 尼木县| 昭觉县|