Unicode数据类型的是是非非(转)

转:http://cio.chinabyte.com/344/9002344.shtml

SQL Server数据库中,数据类型主要分为两类,分别为Unicode数据类型与非Unicode数据类型。通常情况下,如果数据库中存储的信息有多种语言的话,则笔者建议大家采用Unicode数据类型,而不应该使用非Unicode数据类型。

  一、采用Unicode数据类型的原因。

  之所以需要在利用多种语言存储的数据库中采用Unicode数据类型,主要是为了一些特殊字符的兼容性。如国内一家企业, 在墨西哥、美国、加拿大、魁北克等国家都有客户。那么在系统中就需要记录这些客户的地址,以方便员工寄快递等等。但是在地址信息中往往含有某种语言的特殊 字符。所以如果采用非Unicode数据类型时,很难保证数据库系统能够正确存储这些特殊字符,并在下次读取数据的时候进行正确的转换。为此党之使用字符 列和代码页的时候,必须要当心,数据库管理员要确保于数据库一起安装的代码页能够处理多种语言的特殊字符。还有在运行某种语言的代码页时客户端读取另一种语言的字符时,要确保字符能够被正确转换。

  如现在的不少应用软件都支持多语种。通过客户端的选择,可以支持法语、俄语、日语、中文等等。也就是说,在数据库中某个客户的地址可能会以以上 不同的语言来存储,以实现系统的多语言环境。而有时候,客户端可能是中文的,但是用户需要把法文的地址保存在数据库中,此时数据库管理员就需要确保法文地 址(可能还有一些特殊的字符)能够在数据库中正确保存;而当另外的一个用户使用英文客户端环境需要能够正确读取这个法文的地址。要实现这个需求的话,则在 数据库安装的时候需要选择Unicode数据类型。

  二、Unicode数据类型的特点。

  Unicode数据类型是一种将码位印射到字符的标准。这个数据类型在设计的时候,就涵盖了几乎世界上所有语言的全部字符,所以在保存或者读取 数据的时候,不需要不同的代码页来处理不同的字符集。为此在多语言环境下,也就可以顺利保存、读取各种语言下的一些特殊字符。因为采用了Unicode数 据类型,在保存的时候就是以原始的数据保存,在读取的时候也是读取原始的数据。无论在保存还是在读取的时候,都不需要进行额外的转换,采用不同语言的客户 端所看到的数据库中的数据是相同的字符。

  在SQL Server数据库中支持Unicode数据类型。数据库将所有文字系统目录数据存储在包含Unicode数据类型的列中;表视图存储过程等数据库对象的名称也存储在Unicode列中。如此的话,在开发应用程序的时候,只需要使用Unicode数据类型,就可以避免所有不同语言的代码页在转换过程中遇到的字符识别问题。

  三、采用Unicode数据类型对性能的影响。

  Unicode数据类型与非Unicode数据类型其在内部的实现机制上是不同的,为此对于数据库的性能也有不同的影响。一般来说,采用非 Unicode数据类型的数据库要比采用Uncode数据类型的数据库性能上来的优越。不过如果在设计数据库的时候,索引等方面设计的比较好,那么这个性 能上的差距会很小。这是什么意思呢?如果两个数据库,分别采用了Unicode数据类型与非Unicode数据类型。如果这两个数据库的索引等配制不怎么 合理,那么两个数据库的性能差异就会比较大,采用非Unicode数据类型的数据库系能要比采用Unicode数据类型的要高。但是如果两个数据库的索引 设置的比较合理,那么他们虽然采用了不同的数据类型,但是性能上的差异就会很小。这一点是数据库管理员在部署数据库系统是选择数据类型所必须要了解的一个 内容。

  那么他们为何有这些性能上的差异呢?主要是因为排序规则的差异所造成的。因为Unicode数据类型与非Unicode数据类型的排序规则不 同。如默认情况下,所有的Unicode字符在数据库中均采用2个字节存储。而对于非Unicode数据类型来说,则有的是以单字节存储,而有的是以双字 节存储。如所有非东亚语言和泰语均采用单字节来存储非Unicode字符。而从排序角度来说,单字节字符的排序比双字节字符的排序性能要高的多。所以同一 张表,采用数据类型不同,则他们的排序性能会有比较大的差异。表中的记录越多,这个性能差异也会越大。不过通过合理设置索引的话,可以把这种差异降低到最 低。

  另外两种数据类型采用的排序规则也不同。在SQL Server数据库中,使用Unicode排序规则来执行用微软排 序规则定义的非Unicode数据的字符串比较。由于这些规则比非Unicode排序规则复杂得多,所以它们更占用资源。所以尽管Unicode排序规则 的代价通常更大,但Unicode数据类型与微软排序规则定义的非Unicode数据之间的性能差异一般情况下不会很大。数据库使用非Unicode排序 规则的唯一情况是对于使用数据库排序规则定义的非Unicode数据。在这种情况下,排序和扫描通常比应用Unicode排序规则时快。Unicode排 序规则应用于使用微软排序规则或SQL排序规则定义的所有Unicode数据。通常情况下,通过优化索引也可以缩小这个性能上的差距。

  所以说,只有在设计不合理的情况下,采用Unicode数据类型的数据库与采取非Unicode数据类型的数据库之间在性能上存在比较大的差异。而这些差异都可以通过优化数据库性能来避免。不过话说回来,即使对数据库进行了充分的优化,这个性能上的差异仍然存在,不可能彻底的消除。只是这个差异可能会比较小,小到可以忽视的程度。

  四、在什么时候该采用Unicode数据类型?

  通常情况下,应该根据应用系统来判断是否该采用Unicode数据类型。如果前台的应用软件其设计的时候,有多语言应用环境的需求,在最好在数 据库安装的时候,选择采用Unicode数据类型。否则的话,即使在应用系统层面实现了多语言的支持,但是在显示的时候,仍然可能会出现乱码等非正常现 象。另外即使应用软件不支持多语言,但是在用户在保存数据的时候,如果需要用到保存其他语言的字符时(如用户可能直接从客户网站上复制地址信息来保存), 此时也需要让数据库采用Unicode数据类型。否则的话,这些其他语言的字符将无法正常保存或者正常显示。

  另外需要注意的是,在是否需要采用Unicode数据类型的时候,其主要从用户的需求出发,而其对性能的不利影响是放在次要位置上。因为如果用 户正的有这方面需求,这是属于刚性需求。到目前为止,在数据库中只有通过Unicode数据类型可以解决这方面的字符转换与显示问题,而没有第二条路可以 走。相反,Unicode数据类型对于数据库性能的影响,则是可以通过优化数据库来避免的。如可以对数据库表中的索引进行优化、对SQL语句进行优化、对 客户端与服务器端的字符转换方式进行优化等等。通过这些优化手段可以让Unicode数据类型对数据库性能的不利影响降低到最低,达到可以忽略不计的地步。

  为此笔者建议,在大部分情况下或者数据库管理员不知道该选择哪种数据类型的情况下,那就采用Unicode数据类型。因为一旦选择好了数据类型 之后,以后就不能够重新调整了。除非你重新部署数据库,重新导入数据。在目前国际化的大背景下,选择Unicode数据类型来部署数据库,是一个一劳永逸 的解决方案。笔者现在在部署数据库的时候,基本上都是选择了Unicode数据类型。

posted @ 2014-10-16 11:55  叫我工作狂  阅读(371)  评论(0编辑  收藏  举报