企業常選擇英文版 Windows Server (穩定性較佳) 做為資料庫主機,但預設不支援中文代碼頁。本文提供經實測的三步驟設定,啟用代碼頁 936 (GBK/簡體中文),讓 ASP/ADO 應用正確讀寫中文,避免「???」亂碼。
C_936.nls 至 C:\Windows\System32\ (來源:中文版 Windows 安裝光碟 \I386\ 或網路下載)regedit.exe,新增兩組機碼:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"936"="C_936.NLS"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language]
"0804"="l_intl.nls"
Chinese_PRC_CI_AS (簡體、不區分大小寫、不區分重音)SELECT SERVERPROPERTY('Collation') 應回傳 Chinese_PRC_CI_AS注意:重建 Master 會清除所有使用者資料庫、登入、作業,請先備份 master、msdb、model 及使用者資料庫。
<%@ CodePage=936 Language=VBScript %>
<% Response.CodePage = 936; Response.Charset = "gb2312" %>
ASP.NET (web.config):
-- SSMS 執行
CREATE TABLE #Test (C NVARCHAR(10));
INSERT #Test VALUES (N'中文測試');
SELECT * FROM #Test; -- 應正確顯示中文
-- ASP 頁面
Response.Write "中文測試"; -- 應正常輸出
| 現象 | 原因 | 解法 |
|---|---|---|
| 資料庫存入正常,ASP 顯示亂碼 | 頁面未宣告 CodePage | 加入 <%@ CodePage=936 %> |
| ASP 存入資料庫變 ??? | 連線字串缺少字碼頁 | Provider=SQLOLEDB;Data Source=...;Code Page=936 |
| SSMS 查詢顯示方塊 | SSMS 字型不支援中文 | 工具→選項→字型→選擇「新細明體」或「Microsoft JhengHei」 |
| Linked Server/OPENROWSET 亂碼 | 遠端字碼頁不一致 | 連線字串加 Use Encryption for Data=False;CharacterSet=gb2312 |
CREATE DATABASE ... COLLATE Chinese_PRC_CI_AS,無需重建 MasterColumn NVARCHAR(50) COLLATE Chinese_PRC_CI_ASNVARCHAR + Unicode (UTF-16) 儲存,應用層傳輸 UTF-8,徹底擺脫代碼頁地獄結語:雖然代碼頁設定能解決舊系統相容問題,但新專案強烈建議採用全 Unicode 架構 (NVARCHAR + UTF-8),一次解決所有語言顯示問題。