日期:2014-04-23  浏览次数:20714 次

简介

Microsoft? SQL Server? 2000 包括各种支持国际化操作和环境的强大功能。扩展的多种语言功能使 SQL Server 2000 成为一种引人注目的数据库产品和应用程序平台。本文将完整地概述在全球范围内使用这些功能的方法。除了列出一系列功能外,本文还将解释国际化/多种语言要求会怎样影响项目的各个方面。

什么是 Unicode?如何使用 Unicode?

Unicode 支持是 SQL Server 2000 多种语言支持的基础。Unicode 是一种标准,旨在支持全球所有的脚本。无论是何种平台、程序还是语言,Unicode 为每个字符提供了一个唯一的代码数据点。支持 Unicode 的程序可以处理任何语言的数据。Unicode 3.0 能够处理多达 1,114,112 个字符。

Unicode 是由 Unicode Consortium 管理的行业标准。该组织认识到所有语言具有单一字符集的重要性。Microsoft 是 Unicode Consortium 的成员。大部分参加的公司与 Microsoft 都有相同的动机:在创建全球软件解决方案之际,呈现多种语言数据能力的重要性是显而易见的。其他许多公司和个人的加入是为了了解多种语言数据处理方面的问题和技巧。

现在的 Unicode Standard 3.01 版等同于 ISO-10646,后者是继 Unicode 1.1 发布之后与 Unicode 中所有代码数据点匹配的国际化标准。行业标准和国际化标准的有效结合后,可以防止任何个人因个人利益而违反这两种标准的目标:建立适用于所有人的字符集!

有关详细信息,请访问 Unicode Consortium 的 Web 站点。

编码

Unicode 将代码数据点映射到字符,但实际上对数据在内存、数据库中或 Web 页上的表示方式并不作具体说明。这就是实际的 Unicode 数据编码的作用。Unicode 具有多种不同的编码。本节将说明以下几种常用的编码:

  • UCS-2

  • UTF-16

  • UTF-8

利用本文提供的有关编码的信息,您可以更好地了解 Unicode 以及存储 Unicode 的一些方法。通常情况下,只需选择一种 Unicode 数据类型即可,而不必考虑这些细节。但在下列情况下,了解编码都是相当重要的:

  • 正在处理可能用其他方式对 Unicode 进行编码的应用程序

  • 必须向其他平台(非 Microsoft Windows?)或 Web 服务器发送数据

  • 必须管理数据与其他编码之间的导入或导出

UCS-2

UCS-2 是 Microsoft Windows NT? 4.0、Microsoft? SQL Server? 7.0 版和 Microsoft SQL Server 2000 所使用的主要 Unicode 编码。UCS-2 允许对 65,536 个不同代码点进行编码。存储在 SQL Server 2000 的 Unicode 中的所有信息均以这种编码进行存储,即无论所使用的是什么字符,都会用两个字节表示每一个字符。因此,拉丁字母“A”的处理方式与以下字母相同:

 

  • 西里尔字母 Sha 

     

     

  • 希伯来字母 Lamed 

     

     

  • 泰米尔字母 Rra 

     

     

  • 日文平假名字母 E 

 

每个字母都有一个唯一的代码数据点(对于这些字母,代码数据点分别是 U+0041、U+0248、U+05DC、U+0BB1 和 U+3048,其中每个四位 16 进制数字都表示 UCS-2 所使用的两个字节)。

字节的排序在操作系统级中是至关重要的。由于 SQL Server 在 Windows 平台上运行,它使用的是 Little Endian 编码系统(指“小数在前”)。因此,象 0x1234 这样的 16 进制词将在内存中存储为 0x34 0x12。

UTF-16

UTF-16 是 Microsoft Windows 2000 所使用的主要 Unicode 编码。即使在 Unicode 2.0 发布之前,人们都已清楚地认识到,仅用 65,536 个字符不能实现 Unicode 的目标(即支持每种语言中每个字符对应一个代码数据点)。对于有些语言(如中文),仅是对罕用字符进行编码,就需要这么多的字符。因此,人们添加了对代理范围的支持,以处理额外的 1,048,576 个字符。UTF-16 是完全支持对原始标准进行这种扩展的编码。有关代理范围的信息,请参见主题什么是代理?

UTF-16 所遵循的是每个代码数据点两个字节的相同标准。但是,对于 UTF-16,某些代码数据点会使用紧跟其后的另一代码数据点来定义字符。

与 UCS-2 相似,UTF-16 也以 Little Endian 的方式进行存储,就象在默认情况下在 Windows 上存储一样。

重要   虽然 UCS-2 不识别代理,但它不会破坏代理所在数据库中的实际数据,而是将它们当作两个单独(未定义)的字符。

虽然 SQL Server 7.0 和 SQL Server 2000 可以毫无损失地存储代理对,但它们却将代理对当作两个未定义的 Unicode 字符,而不是一个单独的字符。这样的应用程序通常会被描述为代理“中立”或代理“安全”,其中安全是指能够存储数据,即使本身并不能与其进行交互。目前,由于没有正式定义的代理字符,所以代理“识别”应用程序相当少见。Microsoft word 2000、Microsoft Windows 2000 和 Microsoft Internet Explorer 5.0 以及更高版本就是几种代理识别应用程序。

UTF-8

许多要求 8 位编码的 ASCII 和其他面向字节的系统(如邮件服务器)都必须跨越多种使用不同编码、不同字节排序和不同语言的计算机。UTF-8 是一种与计算机上的字节排序无关的用于处理 Unicode 数据的编码架构。虽然 SQL Server 2000 不以 UTF-8 形式存储数据,但它在至少一种关键情形下支持 UTF-8,即支持可扩展标记语言 (XML)。有关详细信息,请参见本文后面的使用 SQL Server 2000 的 XML 支持来处理多种语言数据。

其他许多数据库系统(如 Oracle 和 Sybase SQL Server)都支持使用 UTF-8 进行存储的 Unicode。根据服务器的实现方法,数据库引擎在技术上可以更为容易地实现这种支持(服务器上现有的所有文本管理代码每次只处理 1 字节的数据,因此不需要太大的更改)。在 Windows 环境中,UTF-8 存储具有以下缺点:

  • 组件对象模型 (COM) 在其 API 和接口中只支持 UTF-16/UCS-2。如果数据以 UTF-8 格式存储,则经常需要进行转换(只有在使用 COM 时才会出现这种问题;SQL Server 数据库引擎通常不调用 COM 接口)。

  • Windows NT 和 Windows 2000 的内核都是 Unicode,它们分别使用 UCS-2 和 UTF-16。同样,UTF-8 存储格式需要许多额外的转换(如先前对 COM 的说明一样,这不会给 SQL Server 数据库引擎造成转换上的问题,但可能会影响许多客户端操作)。

  • 对许多字符串操作,UTF-8 可能会较慢。由于字符没有固定的宽度,排序、比较和几乎任何字符串操作都可能会减慢。

  • UTF-8 通常需要两个以上字节,但增加的大小会占用磁盘上和内存中的更大空间。

由于 XML 是较为重要的 Internet(它往往面向字节)通信标准,所以它默认为 UTF-8 是很有道理的。

什么是代理?

代理区域是 Unicode 中从 U+D800 到 U+DFFF 的范围,它包含 1024 个低代理值和 1024 个高代理值。高代理和低代理可以进行组合,以提供对上百万个可能字符的访问。如果只有一个代理对的一半,则将