某些應用程式 (特別是 Web 應用程式) 必須處理以 UTF-8 編碼方法所編碼的 Unicode 資料。SQL
Server 7.0 和 SQL Server 2000 使用不同的 Unicode 編碼方式 (UCS-2),無法將 UTF-8
識別為有效的字元資料。本文說明處理這種情況時可以使用的一些選項。
Unicode 資料可以用許多不同的方式進行編碼。UCS-2 及 UTF-8 是兩種常用來儲存位元模式的
Unicode 字元表示方式。Microsoft Windows NT、SQL Server、Java、COM 和 SQL Server ODBC
驅動程式以及 OLEDB 提供者在內部都以 UCS-2 代表 Unicode 資料。
使用 SQL Server 7.0 或 SQL
Server 2000 做為應用程式後端伺服器,以傳送及接收由 UTF-8 所編碼的 Unicode 資料的選項包括:
- 如果應用程式使用 Active Server Pages (ASP),並且您使用 Internet
Information Server (IIS) 5.0 及 Microsoft Windows 2000,則可以將 <%
Session.Codepage=65001 %> 新增到伺服器端的 ASP 指令碼中。這會指示 IIS 在傳送字串到用戶端之前,對所有從 UCS-2
到 UTF-8 動態產生的字串 (例如:Response.Write) 進行自動轉換。
如果您不想要啟用工作階段,可以改用伺服器端指示詞
<%@ CodePage=65001 %>。
任何透過 GET 或 POST 從用戶端傳送到伺服器的 UTF-8
資料,也會自動轉換為 UCS-2。Session.Codepage 屬性是我們建議在 Web 應用程式中用來處理 UTF-8 資料的方法。IIS 4.0 及
Windows NT 4.0 並未提供此 Codepage 設定。如需詳細資訊,請參閱「Microsoft 知識庫」中的下列文件:254313?
(http://support.microsoft.com/kb/254313/
)
PRB:Error Message: Active Server Pages Error 'ASP 0203' Invalid Code Page
- 在應用程式中進行 UCS-2 或 UTF-8 之間的相互轉譯是適當的方式。此種轉換的範例程式碼可以在 Unicode
Consortium 網站中找到:
關於將 UCS-2 轉換為 UTF-8 之演算法的高階說明,可以在 Internet Request For Comments
文件 RFC2279 中找到。
在 Windows NT 或 Windows 2000 上,您可以使用 Win32 函式 MultiByteToWideChar 及 WideCharToMultiByte,將常數 CP_UTF8 (65001) 當做函式的第一個參數來傳遞,藉以將 UTF-8 轉換為 UCS-2 或從 UCS-2
轉換為 UTF-8。 - 將應用程式修改為使用 UCS-2 編碼,替代原先的 UTF-8 編碼。
- 使用 BINARY/VARBINARY/IMAGE 資料行,將真正的 UTF-8 資料儲存在伺服器上。在 SQL
Server 上儲存 UTF-8 資料代表您不能像有效字元資料般使用 SQL Server 來排序或尋找這些值的範圍。在包含 UTF-8
資料的資料行上,無法傳回預期結果的作業類型包括了 ORDER BY,greater-than「>」和 less-than「<」比較,及內建的
SQL Server 字串操作函式,例如 SUBSTRING()。
但等於「=」比較卻仍可運作,只要被比較的字串相當於是位元組層級。請注意,如果您在 SQL Server 中儲存 UTF-8 資料,就不應該使用字元資料行
(CHAR/NCHAR/VARCHAR 等等)。UTF-8 對 SQL Server
而言並不是有效的字元資料,並且在字元資料行中儲存非字元資料,可能會發生問題,例如下列「Microsoft 知識庫」文件所討論的問題:
155723?
(http://support.microsoft.com/kb/155723/
)
INF:SQL Server 截斷 DBCS 字串
234748?
(http://support.microsoft.com/kb/234748/
)
PRB:SQL Server ODBC 驅動程式將語言事件轉換為 Unicode
請注意,考慮這個選項時,如果您需要經常在 Web 瀏覽器之外的任何應用程式存取儲存在 SQL
Server 中的 UTF-8 資料 (例如非 Web 的 ODBC 應用程式),便需要在此應用程式中將 UTF-8 轉換為 UCS-2,因為
ODBC、OLEDB、COM、Win32 API 呼叫、VB 和 C 執行階段字串操作函式無法使用 UTF-8
資料。這會將轉譯的負擔轉移到其他應用程式。 - 如果您不需要儲存單一字碼頁無法滿足的多種語言組合資料,則可能不需要使用 Unicode。
SQL Server 從 SQL Server 7.0 開始引進 Unicode 支援。因為 SQL Server
6.5 不支援儲存 Unicode 資料,所以 SQL Server 6.5 的唯一選項就是步驟 4 和步驟 5 所述的內容。