将 utf-8 数据存储在 SQL Server 中的说明


概要


某些应用程序 (尤其是基于 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 提供程序所有内部 Unicode 数据表示为 ucs-2。

使用 SQL Server 7.0 或 SQL Server 2000年作为后端服务器的应用程序发送和接收以 utf-8 编码的 Unicode 数据的选项包括:

  1. 如果您的应用程序使用 Active Server Pages (ASP) 并且您正在使用 Internet 信息服务器 (IIS) 5.0 和 Microsoft Windows 2000,可以将"< %session.codepage=65001%>"添加服务器端 ASP 脚本。这会指示 IIS 将所有动态生成的字符串转换 (示例: Response.Write) 从 ucs-2 为 utf-8 之前自动将它们发送到客户端。

    如果不想启用会话,也可以选择使用服务器端指令"< @ 代码页 %= 65001%>"。

    从客户端发送到服务器通过 GET 或 POST 任何 utf-8 数据也转换为 ucs-2 自动。 Session.Codepage 属性是用于处理 web 应用程序中的 utf-8 数据的推荐的方法。 此代码页设置 IIS 4.0 和 Windows NT 4.0 上没有。有关其他信息,请参阅以下文章 Microsoft 知识库中相应的文章:
    254313错误消息: Active Server Pages 错误 ASP 0203 无效代码
  2. 翻译从 ucs-2 或 utf-8 作为适当的应用程序中。这种类型的转换的示例代码位于 Unicode 协会网站:

    互联网征求意见文档 RFC2279 中找不到要转换为 utf-8 ucs-2 算法的简要介绍。

    在 Windows NT 或 Windows 2000,您可以使用 Win32 函数MultiByteToWideCharWideCharToMultiByte通过传递常量 CP_UTF8 与 ucs-2 utf-8 转换 (65001) 作为第一个参数的函数。
  3. 修改应用程序而不是 utf-8 编码使用 ucs-2。
  4. 使用二进制/低级/图像列在服务器上存储实际的 utf-8 数据。将 utf-8 数据存储在 SQL Server 上意味着您可以不使用 SQL Server 进行排序或像数据是有效的字符数据查找这些值的范围。操作不会返回预期的结果的 utf-8 数据包含的列的类型包括"ORDER BY",更好地-比">"且小于-比"<"比较和如 substring () 内置 SQL Server 的字符串操作函数。

    但是,相等比较起作用,只要在字节级别所比较的字符串相等。请注意,是否您将 utf-8 数据存储在 SQL Server 中不应使用字符列 (CHAR/NCHAR/VARCHAR 等)。无效的 utf-8 是字符数据到 SQL Server,并将非字符数据存储在字符列,则可能遇到问题,例如在以下 Microsoft 知识库文章中讨论的问题:
    155723 INF: SQL Server DBCS 字符串被截断
    234748 PRB: SQL Server ODBC 驱动程序将转换为 Unicode 的语言事件
    如果您正在考虑使用此选项,请注意,如果您以往任何时候都需要访问存储在 SQL Server 内部 Web 浏览器 (例如,从非基于 Web 的 ODBC 应用程序) 之外的任何应用程序从 utf-8 数据您将需要执行从 utf-8 转换为 ucs-2作为 ODBC、 OLEDB、 COM、 Win32 API 调用、 VB 和 C 此应用程序中运行时字符串操作函数不使用 utf-8 数据。这将翻译负担移到不同的应用程序。
  5. 如果您要求不包括存储来自一个单独代码页不能满足需求的语言组合的数据的需要,您可能不需要使用 Unicode。
SQL Server 从 SQL Server 7.0 引入 Unicode 支持。由于 Unicode 数据存储不支持 SQL Server 6.5,在第 4 步和第 5 步中概述了 SQL Server 6.5 的唯一选项。