您当前位置:优侠库 > 资讯攻略 >
来源:未知
2019-07-13 03:02:24 浏览: 分类:资讯攻略

SQL Server数据库简体繁体数据混用的问题

这篇论坛文章主要关注sql server数据库中简化数据和传统数据的混合使用。有关详细信息,请参考以下内容:

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

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

选择表1。*,表2。*

来自表1

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

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


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

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

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

核对

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

语法:

整理& ltcollation _ name & gt

& ltcollation _ name & gt::=

{ 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联机丛书中排序规则的概念贴出来与大家分享,省得大家再去找:

微软?SQL Server?2000支持多种排序规则。排序规则对控制语言(如马其顿语或波兰语)或字母(如西欧语言中使用的拉丁字母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区域设置控制的项目之一,它还定义了其他项目,如数字、时间、日期和货币格式。用微软Windows NT?4.0、微软视窗?98和Microsoft Windows 95,您可以使用“控制面板中的区域设置”应用程序指定Windows区域设置。在Microsoft Windows 2000中,您可以使用“选项”中的“控制面板”“应用程序指定区域设置”。有关Windows区域设置的更多信息,请访问Microsoft网站MSDN?为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数据时返回不同的结果。

关键词:数据,问题,繁体,简体,

优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。

本文链接:http://www.123down.cn/gonglue/227227.html

攻略资讯
安卓软件
安卓游戏