MySQL支持的數據類型

jopen 11年前發布 | 13K 次閱讀 MySQL 數據庫服務器

數值類型


MySQL中包括嚴格數據類型(INTEGER,SAMLLINT,DECIMAL,NUMERIC),以及近似數據類型(FLOAT,REAL,DOUBLE),擴展后增加了TINYINT,MEDIUMINT和BIGINT這三種長度不同的整形,并增加了BIT類型,用來存放位數據。

在整數類型中,按照取值范圍和存儲方式不同,可以分為tinyint,smallint,mediumint,int和bigint這5個類型。

對于整形數據,MySQL支持在類型名稱后面的小括號內指定顯示寬度,例如int(5)表示當數值寬度小于5位的時候在數字前面填滿寬度,如果不顯示指定寬度則默認為int(11)。但是,對大多數應用來說這是沒有意義的,它不會限制值的合法范圍,只是規定了MySQL的一些交互工具用來顯示字符的個數。對于存儲和計算來說,INT(1)和INT(20)是相同的。zerofill是用‘0’填充的意思,在數字位數不夠的空間用字符‘0’填滿。

浮點數存在誤差問題;對貨幣等對精度敏感的數據,應該用定點數表示或存儲;在編程中,如果用到浮點數,要特別注意誤差問題,并盡量避免做浮點數比較;要注意浮點數中一些特殊值的處理。

日期時間類型


Mysql中有多種數據類型可以用于日期和時間的表示。
這些數據類型的主要區別如下:
(1)如果要用來表示年月日,通常用DATE來表示;
(2)如果要用來表示年月日時分秒,通常用DATETIME表示;
(3)如果只用來表示時分秒,通常用TIME來表示;
(4)如果需要進場插入或者更新日期為當前系統時間,則通常使用TIMESTAMP來表示。
(5)如果只是年份,可以使用YEAR來表示。

不同日期類型零值的表示如下所示:
數據類型 零值表示
DATETIME 0000-00-00 00:00:00
TIME 00:00:00
DATE 0000-00-00
TIMESTAMP 00000000000000
YEAR 0000

MySQL提供了FROM_UNIXTIME()函數把Unix時間戳轉換為日期,并提供了UNIX_TIMESTAMP()函數把日期轉換為Unix時間戳。

在存儲數據的時候將整個時間存在一個字段中,采用datetime類型;也可能采用將日期和時間分離,即一個字段存儲date,一個字段存儲時間time。無論怎么存儲,在實際應用中,很可能會出現包含“時間段”類型的查詢,比如一個訪問記錄數據庫,需要統計每天的訪問數量,這個每天就是一個時間段。

下面介紹MySql查詢時間段的兩種常見方法,其他數據庫也可以類似實現。
方法一:傳統方式,即指定開始時間和結束時間,用"between”或者"<",">"來建立條件。
比如查詢2010年3月1日到2010年3月2日的數據條數,則可以使用
 
    select count(*) from sometable where datetimecolumn>='2010-03-01 00:00:00' and datetimecolumn<'2010-03-02 00:00:00  
但是,這種方法由于時間不是整數型數據,所以在比較的時候效率較低,所以如果數據量較大,可以將時間轉換為整數型的UNIX時間戳。

方法二:UNIX時間戳,每個時間對應了一個唯一的UNIX時間戳,該時間戳是從'1970-01-01 00:00:00' 為0開始計時,每秒增加1。MySql內置了傳統時間和UNIX時間的互換函數,分別為UNIX_TIMESTAMP(datetime)和 FROM_UNIXTIME(unixtime)。
比如運行
 
    SELECT UNIX_TIMESTAMP('2010-03-01 00:00:00')  
返回1267372800。

運行
 
    SELECT FROM_UNIXTIME(1267372800)  
返回'2010-03-01 00:00:00'
于是,我們可以將時間字段里的數據替換為整型的UNIX時間,這樣,比較時間就成為整數比較了,建立索引后能大大提高效率。

在查詢的時候,需要把起點時間和結尾時間分別轉換為UNIX時間再進行比較,如
 
    select count(*) from sometable where datetimecolumn>=UNIX_TIMESTAMP('2010-03-01 00:00:00') anddatetimecolumn<UNIX_TIMESTAMP('2010-03-02 00:00:00')  
也可以在調用程序中先轉換為UNIX時間再傳入MySql,總之這種方式有利于快速查詢時間段,不過顯示時間則需要再反轉一次。

字符串類型


CHAR和VARCHAR很類似,都用來保存MySQL中較短的字符串。二者的主要區別在于存儲方式的不同:CHAR列的長度固定為創建表時聲明的長度,長度可以是從0~255的任意值,而VARCHAR列中的值為可變長字符串,長度可以指定為0~255之間的值。在檢索的時候,CHAR刪除了尾部的空格,而VARCHAR則保留了這些空格。
由于CHAR是固定長度的,所以它的處理速度比VARCHAR快得多,但是它的缺點是浪費存儲空間,程序需要對行尾空格進行處理,所以對于那些長度變化不大并且對查詢速度有較高要求的數據可以考慮使用CHAR類型。定長的CHAR類型不容易產生碎片。

如果需要保存大文本時,一般使用TEXT或者BLOB,二者之間的區別主要是BLOB能用來保存二進制數據,比如照片,而TEXT只能保存字符數據,比如一篇文章或者日記。
大文本查詢可以使用合成索引。合成索引是根據大文本字段的內容建立一個散列值,并把這個值存儲在單獨的數據列中,接下來就可以通過檢索散列值找到數據行了。對含有TEXT和BLOB字段的表,如果經常做刪除和修改記錄的操作要定時執行OPTIMIZE TABLE功能對表進行碎片整理。
與其他類型不同,MySQL把每個BLOG和TEXT當做一個獨立的對象處理。存儲引擎在存儲時通常會做特殊處理。當BLOG和TEXT值太大時,InnoDB會使用專門的“外部”存儲區域來進行存儲,此時每個值在行內需要1~4個字節存儲一個指針,然后再外部存儲區域存儲實際的值。

BINARY和VAEBINARY類似于CHAR和VAECHAR,不同的是它們包含了二進制字符串。當保存BINARY值時,在值的最后通過填充“0x00”以達到指定的字段定義長度。

ENUM是枚舉類型,它的值范圍需要在創建表時通過枚舉方式顯示指定。但是ENUM只允許從值集合中選取單個值,而不能一次取多個值。
SET類型可以從允許值中選取任意1個或者多個元素進行組合。如果集合中包含重復的單元,那么我們將會只取一次。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!