SQL Server数据库简体繁体数据混用的问题[MSSQL防范]
本文“SQL Server数据库简体繁体数据混用的问题[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这篇论坛文章侧重介绍了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
说了半天若何办理排序法则冲突惹起的问题,假如还有爱好的话,下面把SQL Server联机丛书里面关于排序法则的概念贴出来给大家分享一下,免得大家再去找:
Microsoft® SQL Server™ 2000 支持多种排序法则.排序法则对掌握精确利用语言(如马其顿语或波兰语)或字母表(如西欧语言利用的拉丁字母表 Latin1_General)字符的法则举行编码.
每个 SQL Server 排序法则指定三个属性:
用于 Unicode 数据范例(nchar、nvarchar 和 ntext)的排序次序.排序次序定义字符的排序序列,以及在对比操作中对字符取值的办法.
用于非 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® 4.0、Microsoft Windows® 98 和 Microsoft Windows 95,可以利用掌握面板中的"区域设置"利用程序指定 Windows 区域设置.关于 Microsoft Windows 2000,可以利用"掌握面板"中的"区域选项"利用程序指定区域设置.有关 Windows 区域设置的更多信息,请拜见 Microsoft Web 站点 MSDN® 页中的 Developing International Software for Windows 95 and Windows NT 4.0.
多个排序法则可对非 Unicode 数据利用相同的代码页.比方,代码页 1251 定义西里尔语字符集.多个排序法则(如 Cyrillic_General、Ukrainian 和 Macedonian)都利用该代码页.固然这些排序法则都利用相同的位集来表示非 Unicode 字符数据,但在处理字典定义时所利用的排序和对比法则略有差别,而字典定义肯定语言或字母表中与排序法则相关的精确字符序列.
因为SQL Server 2000排序法则掌握 Unicode 和非 Unicode 排序次序,所以不会碰到由为 Unicode 和非 Unicode 数据指定差别的排序法则而惹起的问题.在 SQL Server 的早期版本中,对代码页号、字符排序次序和 Unicode 排序法则辨别举行指定.SQL Server 的早期版本还支持每个代码页有差别数目的排序次序,并为某些代码页供应 Windows 区域设置中没有的排序次序.在 SQL Server 7.0 中,还可以指定为非 Unicode 数据挑选的排序次序以外的别的 Unicode 排序次序.这会招致在利用与非 Unicode 数据相对的 Unicode 数据时,排序和对比操作返回差别的后果.
以上是“SQL Server数据库简体繁体数据混用的问题[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |