星期六, 6月 20, 2026

[SQL] UTF-8 定序

SQL Server 2019 功能 - [UTF-8 定序],可以讓 char、varchar 資料型態可以儲存 Unicode

範例說明
USE AdventureWorks2025
GO

DROP TABLE IF EXISTS Utf8Demo

-- 建立測試資料表
CREATE TABLE Utf8Demo (
    ID INT IDENTITY(1,1) PRIMARY KEY,

    -- 一般的 VARCHAR (使用資料庫預設定序,台灣通常是 Chinese_Taiwan_Stroke_CI_AS)
    NormalVarchar VARCHAR(50),
    
    -- 支援 UTF-8 的 VARCHAR (透過指定 _UTF8 結尾的定序)
    Utf8Varchar VARCHAR(50) COLLATE Chinese_Traditional_Stroke_Count_100_CI_AS_SC_UTF8,
    
    -- 傳統支援 Unicode 的 NVARCHAR
    StandardNvarchar NVARCHAR(50)
);

-- 插入測試資料
INSERT INTO Utf8Demo (NormalVarchar, Utf8Varchar, StandardNvarchar)
VALUES 
    ('💩' , '💩' , N'💩') ,  -- UTF-8 varchar 沒有 N
    ('🚀' , N'🚀' , N'🚀') , -- UTF-8 varchar 加上 N
    ('堃' , N'堃' , N'堃');

-- 查詢顯示結果與儲存空間
SELECT 
    NormalVarchar,
    Utf8Varchar,
    StandardNvarchar,
    DATALENGTH(NormalVarchar) AS Normal_Bytes,
    DATALENGTH(Utf8Varchar) AS Utf8_Bytes,
    DATALENGTH(StandardNvarchar) AS Nvarchar_Bytes
FROM Utf8Demo;
從查詢結果可以觀察到
  • Unicode N 符號:可以觀察到 UTF-8 定序 搭配 varchar 欄位情況下,要 insert 進 Unicode,仍然必須加上 N 符號
  • 佔用空間 (Bytes):繁體中文堃在 nvarchar 佔 2 byte、在 UTF-8 定序搭配 varchar 資料型態佔 3 byte,而 Emoji 則是都佔 4 byte

查詢繁體中文 UTF-8 定序

使用 sys.fn_helpcollations 來查詢相關定序
SELECT *
FROM fn_helpcollations()  
WHERE (Name LIKE 'Chinese_Traditional%' OR Name LIKE 'Chinese_Taiwan%')
	AND Name LIKE '%UTF8'

沒有留言:

張貼留言