急:SqlServer2000的排序规则

时间:2021-11-06 00:47:48
有中英文系统,中文系统下安装的是Sql Server2000的排序规则选择Chinese_PRC_BIN,
英文系统下安装的Sql Server2000的排序规则选择为Latin1_General_BIN,
现有1个数据库A,创建时未指定排序规则,其中有1个数据表B,其中的varchar字段创建时也未指定排序规则。
这个表B建立了视图C,其中,对Varchar字段使用了replace函数。
用bcp.exe导出数据时,在中文系统下没有问题,但是在英文系统下会报排序规则冲突。
请问会是什么原因?

1)视图如下:
CREATE VIEW vw_TZ_ForTest 
AS 
SELECT  A.ulReserved      AS 'TimeZone', B.UseXXX      AS 'DaylightSave', 
CAST(replace(B.StartTime,':','&') AS CHAR(8))  AS 'StartTime', 
CAST(replace(B.EndTime,':','&') AS CHAR(8))      AS 'EndTime', 
FROM GLOBELRESERVEDSTABLE A ,T_DaylightSavingTime B    
WHERE A.ulClassIndex = 1000 AND  A.ulObjectIndex =1000 AND A.ulFieldName = 1000 AND A.ulFieldValue = 1000 AND 1=1 

2)导出如下:
C:\Program Files\Microsoft SQL Server\80\Tools\Binn\bcp.exe "SELECT * FROM vw_TZ_forTEST" queryout "D:\TZ.txt" -c -U  sa -P -T -q -e "D:\vw_TZ_forTEST.log" 

3)错误如下(英文系统中)
SQLState = 37000, NativeError = 446 
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot resolve collation conflict for replace operation. 
SQLState = 37000, NativeError = 8180 
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. 

9 个解决方案

#1


 NCHAR(8)--加Nchar

BCP加上-N 命令

#2


有中英文系统,中文系统下安装的是Sql Server2000的排序规则选择Chinese_PRC_BIN,
英文系统下安装的Sql Server2000的排序规则选择为Latin1_General_BIN,
现有1个数据库A,创建时未指定排序规则,其中有1个数据表B,其中的varchar字段创建时也未指定排序规则。
这个表B建立了视图C,其中,对Varchar字段使用了replace函数。
用bcp.exe导出数据时,在中文系统下没有问题,但是在英文系统下会报排序规则冲突。
请问会是什么原因?


沒指定時,字段排序為數據庫的默認排序規則

排序對條件會有影響。。可通過指定排序規序來處理 collate 排序規則

#3


现在查下来,发现问题是这样的。
因为是用安装盘安装的数据库A,而所谓安装其实是在编译服务器上生成数据库,然后备份数据库,
在目的服务器上恢复。因为编译机器是中文的,其Sql Server的实例是Chinese_PRC_BIN,数据库A的排序规则没有指定,
所以是默认,也是Chinese_PRC_BIN。

现在在英文系统上“安装(其实是恢复)”数据库A,这样,数据库A的排序规则还是Chinese_PRC_BIN,
数据表B的varchar字段C的排序规则也是数据库A的默认排序规则(即Chinese_PRC_BIN)
而因为英文系统的实例是Latin1_General_BIN,所以在使用内部函数Replace(字段C, ':', '&')时发生规则冲突.

这里想确认一下:
1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。
   那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN)
2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法?
谢谢

#4


1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。 
  那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN) 

--不是,是根据你当前数据库建立的时候指定的排序规则,但是,通常情况下,如果用户在创建数据库是没有指定对应的规则的话,
--那么默认使用的就是master数据库的排序规则.


2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法? 

-- 在字段上加入 ColumnName collate Latin1_General_BIN 试试,
-- 具体例子在你另外一个帖子里面

#5


  [StartTime]            [VARCHAR](100)   COLLATE Latin1_General_BIN  NOT NULL, 
  [EndTime]              [VARCHAR](100) COLLATE Latin1_General_BIN NOT NULL, 

试试

#6


引用 3 楼 defan 的回复:
这里想确认一下: 
1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。 
  那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN) 
2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法? 
谢谢


1
不是
2
不改变列的排序规则(表结构中),但在操作时指定排序规则


比如:
select * from tb where name collate Latin1_General_BIN ='aa'

#7


楼主的视图和表在同一个db下面吗?

你的 bcp 导出的时候, 查询没有指定库名, 你登录的用户设置的默认数据库是什么?

#8


楼主的视图和表在同一个db下面吗? 
>>在同一db下面

你的 bcp 导出的时候, 查询没有指定库名, 你登录的用户设置的默认数据库是什么?
>>查询没有指定库名是我贴漏了。贴上来的时候将其他无关的都删除了,可能删多了。
  使用的用户名设置的默认数据库是master。
  不过我即使修改了指定的数据库,还是一样的错误。
  现在最大的问题是REPLACE(A字段,':','&')报排序规则错误。
  此处如果显示指定一个排序规则,譬如REPLACE(A字段,':','&' COLLATE Chinese_PRC_BIN)
                            或者REPLACE(A字段,':','&' COLLATE Latin1_General_BIN)
  结果都是好的。

  此外,如果不用view,单单将创建视图的Sql语句导出,譬如:
  C:\...\bcp.exe "Select replace(A字段,':','&') as 'starttime' ...." queryout ....
  则是没有问题的。
  这个也很奇怪。

#9


在数据库里,用到的字符串常量难道不是当前数据库的排序规则,而是master数据库的排序规则吗?
譬如:Select ... From db1.table1 where  field1='aaa'
我看帮助里有些例子是指定排序规则的:
Select ... From db1.table1 where  field1='aaa' collate Latin1_General_BIN

#1


 NCHAR(8)--加Nchar

BCP加上-N 命令

#2


有中英文系统,中文系统下安装的是Sql Server2000的排序规则选择Chinese_PRC_BIN,
英文系统下安装的Sql Server2000的排序规则选择为Latin1_General_BIN,
现有1个数据库A,创建时未指定排序规则,其中有1个数据表B,其中的varchar字段创建时也未指定排序规则。
这个表B建立了视图C,其中,对Varchar字段使用了replace函数。
用bcp.exe导出数据时,在中文系统下没有问题,但是在英文系统下会报排序规则冲突。
请问会是什么原因?


沒指定時,字段排序為數據庫的默認排序規則

排序對條件會有影響。。可通過指定排序規序來處理 collate 排序規則

#3


现在查下来,发现问题是这样的。
因为是用安装盘安装的数据库A,而所谓安装其实是在编译服务器上生成数据库,然后备份数据库,
在目的服务器上恢复。因为编译机器是中文的,其Sql Server的实例是Chinese_PRC_BIN,数据库A的排序规则没有指定,
所以是默认,也是Chinese_PRC_BIN。

现在在英文系统上“安装(其实是恢复)”数据库A,这样,数据库A的排序规则还是Chinese_PRC_BIN,
数据表B的varchar字段C的排序规则也是数据库A的默认排序规则(即Chinese_PRC_BIN)
而因为英文系统的实例是Latin1_General_BIN,所以在使用内部函数Replace(字段C, ':', '&')时发生规则冲突.

这里想确认一下:
1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。
   那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN)
2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法?
谢谢

#4


1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。 
  那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN) 

--不是,是根据你当前数据库建立的时候指定的排序规则,但是,通常情况下,如果用户在创建数据库是没有指定对应的规则的话,
--那么默认使用的就是master数据库的排序规则.


2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法? 

-- 在字段上加入 ColumnName collate Latin1_General_BIN 试试,
-- 具体例子在你另外一个帖子里面

#5


  [StartTime]            [VARCHAR](100)   COLLATE Latin1_General_BIN  NOT NULL, 
  [EndTime]              [VARCHAR](100) COLLATE Latin1_General_BIN NOT NULL, 

试试

#6


引用 3 楼 defan 的回复:
这里想确认一下: 
1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。 
  那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN) 
2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法? 
谢谢


1
不是
2
不改变列的排序规则(表结构中),但在操作时指定排序规则


比如:
select * from tb where name collate Latin1_General_BIN ='aa'

#7


楼主的视图和表在同一个db下面吗?

你的 bcp 导出的时候, 查询没有指定库名, 你登录的用户设置的默认数据库是什么?

#8


楼主的视图和表在同一个db下面吗? 
>>在同一db下面

你的 bcp 导出的时候, 查询没有指定库名, 你登录的用户设置的默认数据库是什么?
>>查询没有指定库名是我贴漏了。贴上来的时候将其他无关的都删除了,可能删多了。
  使用的用户名设置的默认数据库是master。
  不过我即使修改了指定的数据库,还是一样的错误。
  现在最大的问题是REPLACE(A字段,':','&')报排序规则错误。
  此处如果显示指定一个排序规则,譬如REPLACE(A字段,':','&' COLLATE Chinese_PRC_BIN)
                            或者REPLACE(A字段,':','&' COLLATE Latin1_General_BIN)
  结果都是好的。

  此外,如果不用view,单单将创建视图的Sql语句导出,譬如:
  C:\...\bcp.exe "Select replace(A字段,':','&') as 'starttime' ...." queryout ....
  则是没有问题的。
  这个也很奇怪。

#9


在数据库里,用到的字符串常量难道不是当前数据库的排序规则,而是master数据库的排序规则吗?
譬如:Select ... From db1.table1 where  field1='aaa'
我看帮助里有些例子是指定排序规则的:
Select ... From db1.table1 where  field1='aaa' collate Latin1_General_BIN