天天看點

Sql 資料庫的常用資料類型

總結

參考w3school提供的 http://www.w3school.com.cn/sql/sql_datatypes.asp

參考Python課程裡面對Ascii,Unicode,UTF-8的講解,很詳細清楚:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

char、varchar、nchar、nvarchar的比較:

char查詢效率比varchar高一些,空間使用率比varchar低。

nchar和nvarchar存儲英文的時候需要耗費的空間是(char,varchar)的兩倍,但是可以降低讀取出現亂碼的機率。

是以:

無中文+長度固定=>char

無中文+長度不固定=>varchar

有中文+長度固定=>nchar

有中文+長度不固定=>nvarchar

Character 字元串類型

CREATE table TbCharacter(

    TcNo char(8),                        --1

    TcName varchar(20),            --2

    TcInfo varchar(max),             --3

    TcRemark text                        --4

)

INSERT INTO TbCharacter VALUES ('1班', '小明', '學生資訊', '是個懂事的好孩子,以下是一篇描述小明的很多字短文');

--1.char(n) 固定長度的字元串。最多8,000個字元。補充:一般固定長度的編碼會使用此類型,編碼長度不足n,會用空格補上

--這樣也是可以查詢出資料的,但是實際資料庫的TcNo儲存的是'123     '。

select * from TbCharacter where TcNo='1班'

--結果是2,8,3。資料大小<=存儲大小,是以一般儲存的都是固定長度的編碼。

select len(TcNo) as '實際字元串長度(不是位元組數)',datalength(TcNo) as '儲存位元組長度',datalength(rtrim(TcNo)) as '非空位元組長度' from TbCharacter where TcNo='1班'  

--2.varchar(n) 可變長度的字元串。最多8,000個字元。這個經常使用。

--結果是 2,4,4。證明 資料大小=存儲大小,可以用來儲存長度不确定的資料。

select len(TcName) as '實際字元串長度(不是位元組數)',datalength(TcName) as '儲存位元組長度',datalength(rtrim(TcName)) as '非空位元組長度' from TbCharacter where TcNo='1班'  

--3.varchar(max) 可變長度的字元串。最多 1,073,741,824 個字元。

--結果是 4,8,8。證明同上,應該是上面的擴大版,但是不常遇見。

select len(TcInfo) as '實際字元串長度(不是位元組數)',datalength(TcInfo) as '儲存位元組長度',datalength(rtrim(TcInfo)) as '非空位元組長度' from TbCharacter where TcNo='1班'  

--4.text 可變長度的字元串。最多 2GB 字元資料。

--報錯 [Err] 42000 - [SQL Server]參數資料類型 text 對于 len 函數的參數 1 無效。

select len(TcRemark) as '實際字元串長度(不是位元組數)' from TbCharacter

--必須寫成這個格式,text轉換成varchar(max)就可以進行操作

select len(cast([TcRemark] as varchar(max))) as '實際字元串長度(不是位元組數)' from TbCharacter

-- 48 ,text類型适用的函數不多,據說有可能被抛棄的類型,使用

select datalength(TcRemark) as '儲存位元組長度' from TbCharacter

Unicode 字元串類型:

CREATE table TbUnicode(

    TuNo nchar(8),                        --1

    TuName nvarchar(20),            --2

    TuInfo nvarchar(max),             --3

    TuRemark ntext                       --4

)

--采用同樣的插入資料

INSERT INTO TbUnicode VALUES ('1班', '小明', '學生資訊', '是個懂事的好孩子,以下是一篇描述小明的很多字短文');

--1.nchar(n)    固定長度的 Unicode 資料。最多 4,000 個字元。編碼長度不足n,會用空格補上

--結果是2,16,4。資料大小<=存儲大小,是以一般儲存的都是固定長度的編碼。nchar的位元組長度是char的兩倍。就是說如果儲存的是英文字元,nchar類型需要的存儲空間是char類型的兩倍

select len(TuNo) as '實際字元串長度(不是位元組數)',datalength(TuNo) as '儲存位元組長度',datalength(rtrim(TuNo)) as '非空位元組長度' from TbUnicode where TuNo='1班'  

--2.nvarchar(n)    可變長度的 Unicode 資料。最多 4,000 個字元。     

--3.nvarchar(max)    可變長度的 Unicode 資料。最多 536,870,912 個字元。     

--4.ntext    可變長度的 Unicode 資料。最多 2GB 字元資料。

Binary 類型:

bit    允許 0、1 或 NULL    (我之前遇到的不常用,表示是否也經常使用的是decimal(1,0)這種類型,可能為了友善以後的修改)

image    可變長度的二進制資料。最多 2GB。(一般資料庫隻會儲存圖檔的路徑,很少儲存整個圖檔)

Number 類型:

tinyint    允許從 0 到 255 的所有數字。    1 位元組

smallint    允許從 -32,768 到 32,767 的所有數字。    2 位元組

int    允許從 -2,147,483,648 到 2,147,483,647 的所有數字。    4 位元組

bigint    允許介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之間的所有數字。    8 位元組

decimal(p,s)     和  numeric(p,s)     沒找到什麼差別,之前常用的是decimal

固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。

p 參數訓示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。預設是 18。

s 參數訓示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。預設是 0。

5-17 位元組

float(n)    從 -1.79E + 308 到 1.79E + 308 的浮動精度數字資料。 參數 n 訓示該字段儲存 4 位元組還是 8 位元組。float(24) 儲存 4 位元組,而 float(53) 儲存 8 位元組。n 的預設值是 53。    4 或 8 位元組

Date 類型:

datetime    從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 3.33 毫秒。    8 bytes  

date    僅存儲日期。從 0001 年 1 月 1 日 到 9999 年 12 月 31 日。    3 bytes 

time    僅存儲時間。精度為 100 納秒。    3-5 bytes