範例說明
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
使用 sys.fn_helpcollations 來查詢相關定序
SELECT *
FROM fn_helpcollations()
WHERE (Name LIKE 'Chinese_Traditional%' OR Name LIKE 'Chinese_Taiwan%')
AND Name LIKE '%UTF8'

沒有留言:
張貼留言