SQLServer数据库简体繁体数据混用的问题

SQLServer数据库简体繁体数据混用的问题,第1张

SQLServer数据库简体繁体数据混用的问题,第2张

现在我要讲一个简化和传统数据混用时容易发生,但也容易被忽略的问题。具体来说,当所有具有不同排序规则的数据实例关联数据时,会出现此问题。可能我这么说,大家还是不知道怎么回事。我来说说今天遇到的问题。

该公司使用的数据库将有简体中文和繁体中文版本。我在这个项目中使用的SQLServer是繁体中文版,但是我需要使用另一个使用简体中文版项目的数据。我把SQLServer简体中文版中的一个数据表导入到SQLServer now繁体中文版中,结构和数据都导入成功了。一开始,我并没有意识到问题会是什么。接下来,我开始调试SQL语句,这实际上是两个表之间非常简单的数据选择,大致如下:

选择表1。*,表2。*

来自表1

表2上的内部联接表2。FK =表1。对决

按理说这么简单的语句毫无意义,但是查询分析器中总是指示出以下错误。

服务器:消息446,第16级,状态9,第1行

无法解决等于操作的排序规则冲突。

搜了一下,再看T-SQL的帮助,才知道原来是因为我把简体中文SQL Server中的数据表导入到繁体中文的数据表中,然后和原数据的排序方式一起导入,导致简体数据表的排序方式还是简体的,无法比较,导致错误。解决方案是命名排序方法,并告诉查询分析器如何排序。这里需要一个关键字COLLATE Coliate。SQLServer联机丛书中对此进行了解释:

核对

一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则投影。

语法:

校对<校对名称>

<排序规则名称>::=

{ Windows排序规则名称} | { SQL排序规则名称}

参数

归类名称

应用于表达式、列定义或数据库定义的排序规则的名称。排序规则名称可以是指定的Windows排序规则名称或SQL排序规则名称。

Windows _排序规则_名称

这是Windows定序的定序名称。请参见Windows排序规则名称。

SQL_collation_name

这是SQL定序的定序名称。请参见SQL排序规则名称。

那么我们如何知道当前的排序规则名称是什么呢?事实上,当我们创建一个数据库(实例)时,可以选择这个排序规则名称,但通常我们将默认为原始设置,不会更改它。因此,如果是简体中文SQLServer,它将默认为简体中文排序规则,而如果是繁体中文SQLServer,它将默认为繁体中文排序规则。当我们查看数据库(实例)的属性时,general选项卡的最后一行是当前的排序规则。默认情况下,简体中文的归类名称为:中文_PRC_CI_AS,繁体中文的归类名称为:中文_台湾_笔画_CI_AS。因此,如果我们有简体中文和繁体中文的混合排序规则名称,我们只需要说明您希望使用哪种排序规则进行比较。例如,对于上面的SQL语句,下面两种方法可以解决错误提示。

选择表1。*,表2。*

来自表1

表2上的内部联接表2。FK =表1。PK校对中文_PRC_CI_AS

选择表1。*,表2。*

来自表1

表2上的内部联接表2。FK =表1。PK校对中文_台湾_笔画_CI_AS

讲了半天如何解决排序规则冲突带来的问题,如果还有兴趣,请把SQL Server联机丛书中排序规则的概念贴出来与大家分享,省得大家再去找:

微软& regSQL Server & # 84822000支持多种排序规则。排序规则对控制语言(如马其顿语或波兰语)或字母(如西欧语言中使用的拉丁字母Latin1_General)中字符正确使用的规则进行编码。

每个SQL Server排序规则指定三个属性:

Unicode数据类型(nchar、nvarchar和ntext)的排序顺序。Order定义了字符的排序顺序,以及在比较操作中给字符赋值的方法。

非unicode字符数据类型(char、varchar和text)的排序顺序。

用于存储非unicode字符数据的代码页。

注意不能指定与Unicode数据类型(nchar、nvarchar和ntext)对应的代码页。用于Unicode字符的双字节位模式是由Unicode标准定义的,不能更改。

您可以在任何级别指定SQL Server 2000排序规则。安装SQL Server 2000实例时,可以指定该实例的默认排序规则。每次创建数据库时,都可以指定数据库的默认排序规则。如果未指定排序规则,则数据库的默认排序规则是实例的默认排序规则。无论何时定义字符列、变量或参数,都可以指定这些对象的排序规则。如果未指定排序规则,将使用数据库的默认排序规则创建这些对象。

如果SQL Server实例的所有用户使用同一种语言,您应该选择支持该语言的排序规则。例如,如果所有用户都说法语,请选择法语排序规则。

如果SQL Server实例的用户使用多种语言,您应该选择能够支持多语言要求的排序规则。例如,如果用户通常使用西欧语言,请选择Latin1_General排序规则。当支持多语言用户时,对所有字符数据使用Unicode数据类型nchar、nvarchar和ntext是最重要的。Unicode旨在消除非unicode char、varchar和text数据类型的代码页转换的困难。因为排序规则定义了比较操作的排序顺序和Unicode字符的排序,所以当所有列都用Unicode数据类型实现时,排序规则仍然是不同的。即使使用Unicode数据类型存储字符数据,如果使用非Unicode数据类型实现列或变量,也应该选择支持大多数用户的排序规则。

SQL Server排序规则定义了数据库引擎如何存储和操作字符和Unicode数据。但是,将数据移入应用程序后,应用程序中的字符排序和比较将由您计算机上选定的Windows区域设置控制。应用程序使用的字符数据排序规则是由Windows区域设置控制的项目之一,它还定义了其他项目,如数字、时间、日期和货币格式。使用Microsoft Windows NT & reg4.0、微软视窗& reg98和Microsoft Windows 95,您可以使用控制面板中的“区域设置”应用程序来指定Windows区域设置。对于Microsoft Windows 2000,您可以使用“控制面板”中的“区域选项”应用程序来指定区域设置。请访问微软网站MSDN & reg;有关Windows区域设置的更多信息。为windows 95和windows nt 4.0开发国际软件。

多个排序规则可以对非unicode数据使用同一个Unicode页。例如,代码页1251定义了西里尔字符集。此代码页由多种排序规则使用,如Cyrillic_General、乌克兰语和马其顿语。虽然这些排序规则都使用相同的位集来表示非Unicode字符数据,但在处理字典定义时应用的排序规则和比较规则略有不同,字典定义决定了与语言或字母表中的排序规则相关的正确字符序列。

因为SQL Server 2000排序规则控制Unicode和非Unicode排序顺序,所以它不会遇到为Unicode和非Unicode数据指定不同排序规则所导致的问题。在SQL Server的早期版本中,代码页号、字符排序顺序和Unicode排序规则是分别指定的。SQL Server的早期版本还支持每个代码页有不同数量的排序顺序,并为一些代码页提供了Windows区域设置中没有的排序顺序。在SQL Server 7.0中,除了为非Unicode数据选择的排序顺序之外,还可以指定Unicode排序顺序。这将导致排序和比较操作在使用Unicode数据和非Unicode数据时返回不同的结果。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » SQLServer数据库简体繁体数据混用的问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情