資料庫基礎01——ANSI SQL資料型別
資料庫基礎01——ANSI SQL資料型別
首先總結下ANSI SQL支援的基本資料型別
主要有三:
- 字串型別
- 數值型別
- 日期和時間型別
- 其他
1、字串型別
1.1定長字串
型別 | 描述 |
---|---|
CHARACTER(n) | n定義了欄位能夠儲存的最多字串數量。使用定長字串,通常會用空格來填充數量不足的字。所以,不要使用定長資料型別來儲存長度不定的資料,會導致空間浪費。 |
1.2 變長字串
型別 | 描述 |
---|---|
CHARACTER VARYING(n) | ANSI 標準的sql,一般用以下幾個 |
VARCHAR(n) | Sql server 和MySql ; 字元/字串。可變長度。最大長度 n。 |
VARINARY(n) | Oracle; 字元/字串。 可變長度。最大長度 n。 |
VARCHAR2(n) | Oracle; 字元/字串。可變長度。最大長度 n。 |
1.3 定長、變長串,用於存二進位制資料
型別 | 描述 |
---|---|
BINARY(n) | 固定長度為 n 位元組,其中 n 值從 1 到 8,000 ,儲存空間為 n 位元組 |
VARBINARY( n|max) | 可變長度,n 的取值範圍為 1 至 8,000, max 是指最大儲存空間是 2^31-1 個位元組,即最大4GB; |
注意都是位元組 | n:在表列定義或變數宣告語句中沒有指定 n,則預設長度為 1; 在CAST 函式中沒有指定 n,則預設長度為 30; |
這兩種表示儲存的的都是位元組,這種資料型別通常用來儲存數字式資料,例如影象檔案。
1.3 大物件資料
常見的有:BLOB 和 TEXT
型別 | 描述 |
---|---|
BLOB | BLOB是二進位制大物件,它的資料是很長的二進位制字串(位元組串),BLOB適合在資料庫裡儲存二進位制媒體檔案,比如影象和mp3 |
TEXT | TEXT資料型別是一種字串型別,通常用於在資料庫裡儲存大字符集,可以理解為是一種很大的VARCHAR, 比如部落格站點的HTML輸入 |
2、數值型別
SQL數值的標準有:
BIT(n)
BIT VARYING(n)
DECIMAL(p,s)
INTEGER
SMALLINT
BIGINT
FLOAT(p,s)
DOUBLE PRECISION(p,s)
REAL(s)
一般常用 DECIMAL(p,s) p表示欄位的最大長度,s表示小數點後面的位數
2.1 小數型別
型別 | 描述 |
---|---|
DECIMAL(p,s) | p表示有效位數(總體長度),s表示標度。 小數點不算做一個字元 |
超過定義的位數會被四捨五入,比如 DECIMAL(4,2)表示的字元, 12.449 就會被四捨五入為12.45 |
2.2 整數型別
型別 | 描述 |
---|---|
INTEGER§ | 整數值,精度為p |
SMALLINT | 整數值,精度為5 |
BIGINT | 整數值,精度為19 |
INTEGER | 整數值,精度為10 |
2.3 浮點數
浮點數是有效位數和標度都可變並且沒有限制的小數數值 。
型別 | 描述 |
---|---|
REAL | 單精度浮點數值 |
DOUBLE PRECISION | 雙精度浮點數值 |
FLOAT | 近似數值,尾數精度 16。 |
FLOAT(n) | 近似數值,尾數精度為n |
3、日期和時間型別
標準SQL 支援 DATETIME資料型別,包括
DATE 、 TIME 、DATETIME、 TIMESTAMP
DATETIME 元素包括:
YEAR、 MONTH、 DAY 、HOUR 、MINUTE 、SEOND
型別 | 描述 |
---|---|
DATE | 儲存年、月、日的值。 |
TIME | 儲存小時、分、秒的值。 |
DATETIME | 儲存年、月、日、小時、分、秒的值。 |
TIMESTAMP | 儲存年、月、日、小時、分、秒的值。 |
4、其他型別概念
4.1、直義字串
直義字串就是一系列字元, 比如姓名或電話號碼, 這是由使用者或程式明確指定的。 直義字串包含
的資料與前面介紹的資料型別具有一樣的屬性, 但字串的值是已知的。 列本身的值通常是不能確定的,
因為每一列通常包含了欄位在全部記錄裡的不同值。比如我們查詢的時候 ,where name=‘zhangsan’ 這個‘zhangsan’就是一個直義字串,知道有這麼回事就行
4.2、Null 資料型別
NULL值表示沒有值。 NULL值在SQL裡有廣泛的應用, 包括表的建立、 查詢的搜尋
條件, 甚至是在直義字串裡。
4.3、布林值
布林值的取值範圍是TRUE、 FALSE和NULL, 用於進行資料比較。 舉例來說, 在查詢中設定條件時,
每個條件都會被求值, 得到TRUE、 FALSE或NULL。 如果查詢中所有條件的值都是TRUE, 資料就會被返
回; 如果某個條件的值是FALSE或NULL, 資料就不會返回。
注意;
大多數資料庫實現並沒有一個嚴格意義上的BOOLEAN型別, 而是代之以各自不同的實現方法。
MySQL擁有BOOLEAN型別, 但實質上與其現有的TINYINT型別相同。 Oracle傾向於讓使用者使用一個
CHAR(1)值來代替布林值, 而SQL Server則使用BIT來代替。
4.4、自定義型別
語句CREATE TYPE用於建立自定義型別。
舉例來說, 在MySQL和Oracle中, 可以像下面這樣建立一個型別:
CREATE TYPE PERSON OBJECT
(NAME VARCHAR(30),
SSH VARCHAR(9));
然後就可以像這樣引用自定義型別:
CREATE TABLE EMP_PAY
(EMPLOYEE PERSON,
SALARY DECIMAL(10,2),
hIRE_DATE DATE);
4.5 域
域是能夠被使用的有效資料型別的集合。 域與資料相關聯, 從而只接受特定的資料。 在域建立之後,
我們可以向域新增約束。 約束與資料型別共同發揮作用, 從而進一步限制欄位能夠接受的資料。 域的使用
類似於自定義型別。
像這樣可以建立域:
CREATE DOMAIN MONEY_D NUMBER(8,2)
像下面這樣為域新增約束
ALTER DOMAIN MONEY_D
ADD CONSTRAINT MONEY_CON1
CHECK (VALUE >5)
然後像下面這樣引用域
CREATE TABLE EMP_PAY
(EMP_ID NUMBER(9),
EMP_NAME VARCHAR2(30),
PAY_RATE MONEY_D)