從不同預設 Collation(排序規則)的 SQL Server 版本匯入資料時,中文欄位顯示亂碼。典型案例:來源資料庫 Collation 為 SQL_Latin1_General_CP1_CI_AS(不支援中文),目標資料庫為中文 Collation,直接查詢/匯入會導致中文資料損壞。
利用 VARBINARY 作為位元組層級的中介,繞過字元集轉換,保留原始位元組模式,再在目標環境正確解碼。
DECLARE @bb VARCHAR(300);
SET @bb = '';
SELECT @bb = @bb + CAST(CAST(aa AS VARBINARY) AS VARCHAR(300))
FROM RemoteServer.RemoteDB.dbo.SourceTable a;
PRINT @bb;
CAST(aa AS VARBINARY):將來源字串轉為原始位元組序列(不做字元集轉換)。CAST(... AS VARCHAR(300)):在目前連線的 Collation 環境下,將位元組序列解譯為字串。若目前連線 Collation 支援中文(如 Chinese_PRC_CI_AS),即可正確還原中文。| 適用 | 不適用/需注意 |
|---|---|
| 單一 VARCHAR/CHAR 欄位資料修復 | NCHAR/NVARCHAR (Unicode) 欄位 — 已儲存為 UTF-16,不需此技巧 |
| 跨連結伺服器查詢修正顯示 | 大量資料(效能差,逐列迴圈) |
| 匯出腳本產生前的資料清洗 | 包含補字元、Emoji 等超出雙位元組範圍的字元 |
EXEC sp_serveroption 'LinkedServerName', 'collation compatible', 'true';
EXEC sp_serveroption 'LinkedServerName', 'collation name', 'Chinese_PRC_CI_AS';
SELECT aa COLLATE Chinese_PRC_CI_AS FROM RemoteServer.RemoteDB.dbo.SourceTable;
SELECT * FROM OPENQUERY(LinkedServer,
'SELECT CAST(aa AS VARBINARY) AS aa_bin FROM SourceTable');
-- 本端再 CAST(aa_bin AS VARCHAR) COLLATE Chinese_PRC_CI_AS
Chinese_PRC_CI_AS 或 Latin1_General_CI_AS(支援補字元需 _SC 後綴的 90/100 版 Collation)。ALTER COLUMN ... COLLATE ...。VARBINARY 中介法是緊急修復的權宜之計;根本解決在於統一 Collation 架構與正確設定跨伺服器字元集轉換規則。