首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解決 SQL Server 2000 跨版本匯入中文亂碼:CAST 轉 VARBINARY 再轉 VARCHAR 技巧

     編輯:關於SqlServer

問題背景

從不同預設 Collation(排序規則)的 SQL Server 版本匯入資料時,中文欄位顯示亂碼。典型案例:來源資料庫 Collation 為 SQL_Latin1_General_CP1_CI_AS(不支援中文),目標資料庫為中文 Collation,直接查詢/匯入會導致中文資料損壞。

核心解決方案:VARBINARY 中介轉換法

利用 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;

原理逐步解析

  1. CAST(aa AS VARBINARY):將來源字串轉為原始位元組序列(不做字元集轉換)。
  2. CAST(... AS VARCHAR(300)):在目前連線的 Collation 環境下,將位元組序列解譯為字串。若目前連線 Collation 支援中文(如 Chinese_PRC_CI_AS),即可正確還原中文。
  3. 字串串接累積:逐列處理並累加至變數。

適用場景與限制

適用不適用/需注意
單一 VARCHAR/CHAR 欄位資料修復NCHAR/NVARCHAR (Unicode) 欄位 — 已儲存為 UTF-16,不需此技巧
跨連結伺服器查詢修正顯示大量資料(效能差,逐列迴圈)
匯出腳本產生前的資料清洗包含補字元、Emoji 等超出雙位元組範圍的字元

更佳的現代化解決方案

  1. 正確設定連結伺服器 Collation 相容性:
    
    EXEC sp_serveroption 'LinkedServerName', 'collation compatible', 'true';
    EXEC sp_serveroption 'LinkedServerName', 'collation name', 'Chinese_PRC_CI_AS';
    
  2. 在查詢中明確指定 COLLATE:
    
    SELECT aa COLLATE Chinese_PRC_CI_AS FROM RemoteServer.RemoteDB.dbo.SourceTable;
    
  3. 使用 OPENQUERY 並在遠端轉換:
    
    SELECT * FROM OPENQUERY(LinkedServer, 
      'SELECT CAST(aa AS VARBINARY) AS aa_bin FROM SourceTable');
    -- 本端再 CAST(aa_bin AS VARCHAR) COLLATE Chinese_PRC_CI_AS
    
  4. SSIS/匯入精靈指定來源/目標編碼:資料流元件層級設定 CodePage。
  5. 實務建議

    • 新建資料庫統一使用 Chinese_PRC_CI_AS 或 Latin1_General_CI_AS(支援補字元需 _SC 後綴的 90/100 版 Collation)。
    • 跨版本遷移時,優先使用「產生腳本」→ 修正 Collation → 執行腳本,而非直接複製檔案/備份還原。
    • 資料庫層級 Collation 變更需重建資料庫,欄位層級可用 ALTER COLUMN ... COLLATE ...。

    VARBINARY 中介法是緊急修復的權宜之計;根本解決在於統一 Collation 架構與正確設定跨伺服器字元集轉換規則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved