您目前已離線,請等候您的網際網路重新連線

說明在 SQL Server 中儲存 UTF-8 資料

Extended support for SQL Server 2005 ends on April 12, 2016

If you are still running SQL Server 2005 after April 12, 2016, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

本文曾發行於 CHT232580
結論
某些應用程式 (特別是 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 資料的選項包括:
  1. 如果應用程式使用 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 PRB:Error Message: Active Server Pages Error 'ASP 0203' Invalid Code Page
  2. 在應用程式中進行 UCS-2 或 UTF-8 之間的相互轉譯是適當的方式。此種轉換的範例程式碼可以在 Unicode Consortium 網站中找到:

    關於將 UCS-2 轉換為 UTF-8 之演算法的高階說明,可以在 Internet Request For Comments 文件 RFC2279 中找到。

    在 Windows NT 或 Windows 2000 上,您可以使用 Win32 函式 MultiByteToWideCharWideCharToMultiByte,將常數 CP_UTF8 (65001) 當做函式的第一個參數來傳遞,藉以將 UTF-8 轉換為 UCS-2 或從 UCS-2 轉換為 UTF-8。
  3. 將應用程式修改為使用 UCS-2 編碼,替代原先的 UTF-8 編碼。
  4. 使用 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 INF:SQL Server 截斷 DBCS 字串
    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 資料。這會將轉譯的負擔轉移到其他應用程式。
  5. 如果您不需要儲存單一字碼頁無法滿足的多種語言組合資料,則可能不需要使用 Unicode。
SQL Server 從 SQL Server 7.0 開始引進 Unicode 支援。因為 SQL Server 6.5 不支援儲存 Unicode 資料,所以 SQL Server 6.5 的唯一選項就是步驟 4 和步驟 5 所述的內容。
UTF-16 UTF16 international UTF8 UCS2
內容

文章識別碼:232580 - 最後檢閱時間:02/20/2006 12:16:52 - 修訂: 4.1

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbinfo KB232580
意見反應