2018年2月9日 星期五

NChar 與 Char 的差別

簡言之

NChar 是以位元組(2個位元)的方式儲存資料(NVarChar 亦同)
Char 是以位元的方式儲存資料(VarChar 亦同)

說明:
位元組:可以儲存半型字 或 全型字
位元:僅可以儲存半型字

有點雙人床與單人床的概念
雙人床:可以睡 1 個人或是 2 個人
單人床:僅可以睡 1 個人

所以當你要存的資料
只包含 英文、數字,即半型字,可以用 Char 即可
只包含 中文,即全型字,也可以用 Char 但記得長度要開 2 倍,或是直接用 NChar,長度就不用開到 2 倍

舉例:
以下語法會出現 字串或二進位資料會被截斷 的訊息
因為資料"五"是一個全型字,而欄位Char(1)僅能存一個半型字
declare @MyTable Table (ColName Char(1))
insert into @MyTable Values ('五')
改用 NChar
-- 改用 NChar
declare @MyTable Table (ColName NChar(1))
insert into @MyTable Values ('五')
或是改成 2 倍長度
--改成 2 倍長度 Char(2)
declare @MyTable Table (ColName Char(2))
insert into @MyTable Values ('五')
就OK了

若是 中文、英文、數字夾雜,那就看個人喜愛了



另外提供兩個SQL函數(Len、DataLength),可以幫助釐清上面的差別
將語法改成如下:
將欄位長度改成 3
-- 在 Char 的情況下
declare @MyTable Table (ColName Char(3))
insert into @MyTable Values ('五')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 1,即資料的字元數
-- DATALENGTH(ColName) = 3,即欄位的位元數
-- 在 NChar 的情況下
declare @MyTable Table (ColName NChar(3))
insert into @MyTable Values ('五')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 1,即資料的字元數
-- DATALENGTH(ColName) = 6,即欄位的位元數

再來,將資料內容修改一下(儲存一個全型字和一個半型字)
-- 在 Char 的情況下
declare @MyTable Table (ColName Char(3))
insert into @MyTable Values ('五5')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 2,即資料的字元數
-- DATALENGTH(ColName) = 3,即欄位的位元數
-- 在 NChar 的情況下
declare @MyTable Table (ColName NChar(3))
insert into @MyTable Values ('五5')
select *, Len(ColName), DATALENGTH(ColName) from @MyTable
-- 結果:
-- Len(ColName) = 2,即資料的字元數
-- DATALENGTH(ColName) = 6,即欄位的位元數

沒有留言:

張貼留言