星空网站建设

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3|回复: 0

明白SQL Server繁简体数据混用的问题 -

[复制链接]
  • TA的每日心情
    无聊
    6 小时前
  • 签到天数: 44 天

    [LV.5]常住居民I

    10万

    主题

    39

    回帖

    30万

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    305325
    发表于 2025-8-7 11:34:49 | 显示全部楼层 |阅读模式

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

    1*,2*

    1

    22FK=1PK

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

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

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

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

    COLLATE

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

    语法:

    COLLATE_

    _::=

    {W__}|{SQL__}

    参数

    _

    是应用于表达式、列定义或数据库定义的排序规则的称。_可以只是指定的W__或SQL__。

    W__

    是W排序规则的排序规则称。请参见W排序规则称。

    SQL__

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

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

    SELECTT1*,T2*

    FROMT1

    INNERJOINT2ONT2FK=T1PKCOLLATEC_PRC_CI_AS

    SELECTT1*,T2*

    FROMT1

    INNERJOINT2ONT2FK=T1PKCOLLATEC_T_S_CI_AS

    说了半天如何解决排序规则冲突引起的问题,如果还有兴趣的话,下面把SQLS联机丛书里面关于排序规则的概念贴出来给大家分享一下,省得大家再去找:

    MSQLS2000支持多种排序规则。排序规则对控制正确使用语言(如马其顿语或波兰语)或字母表(如西欧语言使用的拉丁字母表L1_G)字符的规则进行编码。

    每个SQLS排序规则指定个属性:

    用于U数据类型(、和)的排序次序。排序次序定义字符的排序序列,以及在比较操作中对字符取值的方法。

    用于非U字符数据类型(、和)的排序次序。

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

    说明不能指定与U数据类型(、和)对应的代码页。用于U字符的双字节位模式由U标准定义且不能更改。

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

    如果SQLS例的所有用户都使用同一种语言,则应选择支持该语言的排序规则。例如,若所有用户都讲法语,则选择法语排序规则。

    如果SQLS例的用户使用多种语言,则应选择能对多语种需求提供比较佳支持的排序规则。例如,如果用户一般都讲西欧语言,则选择L1_G排序规则。当支持使用多种语言的用户时,对所有字符数据都使用U数据类型、和比较为重要。U旨在消除非U、和数据类型的代码页转换困难。因为排序规则定义用于比较操作的排序次序和U字符的排序,所以当用U数据类型现所有的列时,排序规则仍会产生不同。即使当使用U数据类型存储字符数据时,也应选择支持大多数用户的排序规则,以防使用非U数据类型现列或变量。

    SQLS排序规则定义数据库引擎存储和操作字符及U数据的方式。然而,当数据移入应用程序后,在应用程序中进行的字符排序和比较将由计算机上选定的W区域设置控制。应用程序使用的字符数据排序规则是由W区域设置控制的项目之一,区域设置还定义其它项目,如数字、时间、日期和货币格式。对于MWNT40、MW98和MW95,可使用控制面板中的"区域设置"应用程序指定W区域设置。对于MW2000,可使用"控制面板"中的"区域选项"应用程序指定区域设置。有关W区域设置的更多信息,请参见MW站点MSDN页中的DISW95WNT40。

    多个排序规则可对非U数据使用相同的代码页。例如,代码页1251定义西里尔语字符集。多个排序规则(如C_G、U和M)都使用该代码页。虽然这些排序规则都使用相同的位集来表示非U字符数据,但在处理字典定义时所应用的排序和比较规则略有不同,而字典定义确定语言或字母表中与排序规则相关的正确字符序列。

    因为SQLS2000排序规则控制U和非U排序次序,所以不会遇到由为U和非U数据指定不同的排序规则而引起的问题。在SQLS的早期版本中,对代码页号、字符排序次序和U排序规则分别进行指定。SQLS的早期版本还支持每个代码页有不同数目的排序次序,并为某些代码页提供W区域设置中没有的排序次序。在SQLS70中,还可以指定为非U数据选择的排序次序以外的其它U排序次序。这会导致在使用与非U数据相对的U数据时,排序和比较操作返回不同的结果。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表