转: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数据类型。

Unicode数据类型的是是非非(转)的更多相关文章

  1. sqlite 数据类型

    title: SQLITE 数据类型date: 2015-11-20 20:30:52categories: IOS tags: sqlite数据类型 小小程序猿我的博客:http://daycodi ...

  2. MySql中的字符数据类型

    MySql中的varchar类型 1.varchar类型的变化 MySQL数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255根据不同版本数据库 ...

  3. oracle数据类型

    本文转自:http://blog.csdn.net/defonds/article/details/4302695 谢谢原文作者 有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维 ...

  4. sqlite 数据类型 全面

    http://blog.csdn.net/jin868/article/details/5961263 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断.SQ ...

  5. SQL数据类型解释

    SQL数据类型解释 1.char.varchar.text.ntext.bigint.int.smallint.tinyint和bit的区别及数据库的数据类型电脑秘籍 2009-05-15 21:47 ...

  6. SQLServer学习笔记<>sql的范围内查找,sql数据类型,字符串处理函数

    sql的范围内查找 (1)between.....and用法 通常情况下我们查找一个在某固定区域内的所有记录,可以采用>=,<=来写sql语句,例如:查找订单价格在1000到2000之间的 ...

  7. SQL数据类型大全 《转自网络》

    数据类型是数据的一种属性,表示数据所表示信息的类型.任何一种计算机语言都定义了自己的数据类型.当然,不同的程序语言都具有不同的特点,所定义的数据类型的种类和名称都或多或少有些不同.SQLServer ...

  8. SQL Server中易混淆的数据类型

    1)char.varchar.text和nchar.nvarchar.ntextchar和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据 ...

  9. 转:Unicode字符集和多字节字符集关系

    原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...

随机推荐

  1. 使用SSH 工具 Xshell 6连接CentOS 7.4

    在使用Xshell 6连接 服务CentOS 7.4之前,首先你要配置好服务器,如果没有配置好服务器的,请访问: (一)小白教小白配置 服务器 好了,开始正文! 首先准备,SSH 工具 Xshell ...

  2. [CSP-S模拟测试]:山洞(DP+快速幂)

    题目传送门(内部题17) 输入格式 一行两个整数$n$,$m$,含义如题面. 输出格式 一行一个整数,表示方案数模$1e9+7$. 样例 样例输入1: 4 6 样例输出1: 样例输入2: 707 18 ...

  3. UITableView 支持左右滑动(二)

    原理: 用tableView其中一个cell 来展示一个 UIScrollView, 在scrollview上很像放置子tableView 注意点: 外层tableView需要实现手势代理 /* 若重 ...

  4. swoole 安装与简单应用

    方法一:PECL安装 安装依赖包 apt-get install libpcre3 libpcre3-dev 安装swoole pecl install swoole 修改PHP配置 php.ini  ...

  5. ubuntu 设置固定IP

    vim  /etc/network/interface address   要固定的IP地址 netmask  子网掩码  A类地址 默认255.0.0.0   B类地址默 255.255.0.0  ...

  6. 关系型数据库MySQL(三)_触发器

    简介 用来给保证数据完整性的一种方法,经常用于加强数据的完整性: 是与表事件相关的特殊的存储过程,与存储过程的唯一区别是触发器不能执行execute语句调用,而是在用户执行SQL语句时自动触发执行 执 ...

  7. 1381. 删除 (Standard IO)

    题目描述: Alice上化学课时又分心了,他首先画了一个3行N列的表格,然后把数字1到N填入表格的第一行,保证每个数只出现一次,另外两行他也填入数字1到N,但不限制每个数字的出现次数.Alice现在想 ...

  8. 利用select单线程点对点聊天

    select的优点与使用方法 select用单线程的方法遍历所有待读写的I/O接口, 当有接口可用时就会返回. select可设置电脑阻塞或非阻塞. 特别注意: 每次select前都要重新初始化集合和 ...

  9. java--二叉树解析及基本实现

    一.二叉树的结构 在进行链表结构开发的过程之中,会发现所有的数据按照首尾相连的状态进行保存,那么 在进行数据查询时为了判断数据是否存在,这种情况下它所面对的时间复杂度就是"O(n)" ...

  10. Springboot集成Mybatis+PageHelper

    1.Springboot项目引入mysql和mybatis的依赖: <dependency> <groupId>org.mybatis.spring.boot</grou ...