總結
參考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