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

2009-05-12 20:30:31来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

这篇论坛文章着重介绍了SQL Server数据库简体繁体数据混用的问题,详细内容请参考下文:

我现在要说的是一个在简体繁体数据混用的时候很容易发生的问题,但是这个问题也很容易被大家忽略。具体来说,这个问题会在所有采用不同排序规则的数据实例间关联数据的时候发生。也许我这么说大家还是弄不清楚到底是怎么回事儿,我先来讲一下我今天碰到的问题。

公司里面使用的数据库会有简体中文和繁体中文两种版本。我现在这个专案使用的SQLServer是繁体中文版的,但是需要使用到另一个使用简体中文版SQLServer专案的数据,我按照通常的做法把简体中文版SQLServer中的一个数据表导入到现在使用的繁体中文版SQLServer中,结构和数据都导入成功了。我一开始并没有意识到这样做会有什么问题。接下来我开始调试SQL语句,其实是一个很简单的两表关联数据选择大致如下:


select table1.*,table2.*

from table1

inner join table2 on table2.FK = table1.PK

照理说这么简单的语句没道理会出什么问题,不过在查询分析器里面始终提示如下的错误


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

無法解析 equal to 動作的定序衝突。

后来搜索了一下,然后又看了一下T-SQL的帮助,才知道原来是因为我将简体中文SQL Server中的数据表导入到繁体中文的数据表中的是后,连同原数据的排序方式一并导入,导致了简体数据表的排序方式依然是简体,所以无法进行比较,从而出错。解决的办法是指名排序方式,告诉查询分析器应该怎样排序即可。这里会需要用到一个关键字 COLLATE Coliate 在SQLServer联机丛书中是这样解释的:

COLLATE

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

语法:

COLLATE < collation_name >

< collation_name > ::=

{ Windows_collation_name } | { SQL_collation_name }

参数

collation_name

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

Windows_collation_name

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

SQL_collation_name

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

那么我们怎么可以知道当前的排序规则名称是什么呢,其实这个排序规则名称是我们在创建数据库(实例)的时候就可以进行选择的,不过通常情况下我们都会默认原来的设定,不会对其进行变更,所以如果是简体中文的SQLServer就会默认的使用简体中文的排序规则,而如果是繁体中文的SQLServer就会默认的使用繁体中文的排序规则。我们在察看数据库(实例)的属性时,常规页签的最下面一行就是当前的排序规则。在默认的情况下,简体中文的排序规则名称是:Chinese_PRC_CI_AS,而繁体中文的排序规则名称则是:Chinese_Taiwan_Stroke_CI_AS,所以我们如果在有简体繁体排序规则名称混用的时候,只要声明一下你当前要使用哪种排序规则进行比较就可以了,例如针对上面的那个SQL语句,下面两种方法都可以解决那个错误提示的问题

以下为引用的内容:

SELECT Table1.*,Table2.*

FROM Table1

INNER JOIN Table2 ON Table2.FK = Table1.PK COLLATE Chinese_PRC_CI_AS

SELECT Table1.*,Table2.*

FROM Table1

INNER JOIN Table2 ON Table2.FK = Table1.PK COLLATE Chinese_Taiwan_Stroke_CI_AS

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SQL Server中如何快速获取表的记录总数

下一篇:讲解SQL Server海量数据导入的最快方法