初始选择结果
select * from WordDictionary
下面是按照汉字拼音排序
select * from WordDictionary order by word collate Chinese_PRC_CS_AS_KS_WS
其中:
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS) 是否区分假名类型,KI不区分,KS区分
_WI(WS) 是否区分宽度 WI不区分,WS区分
SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则
标签:
小编还为您整理了以下内容,可能对您也有帮助:
在SQLServer中如果实现Windows文件夹中按名称排序?算法是什么怎么Order By
SQL SERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有一个错误大家应是经常碰到: SQL SERVER数据库,在跨库多表连接查询时,若两数据库默认字符集不同,系统就会返回这样的错误:
“无法解决 equal to 操作的排序规则冲突。”
一.错误分析:
这个错误是因为排序规则不一致造成的,我们做个测试,比如:
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,
value int)
create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,
value int )
表建好后,执行连接查询:
select * from #t1 A inner join #t2 B on A.name=B.name
这样,错误就出现了:
服务器: 消息 446,级别 16,状态 9,行 1
无法解决 equal to 操作的排序规则冲突。
要排除这个错误,最简单方法是,表连接时指定它的排序规则,这样错误就不再出现了。语句这样写:
select *
from #t1 A inner join #t2 B
on A.name=B.name collate Chinese_PRC_CI_AI_WS
二.排序规则简介:
什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server 2000 中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。
select * from ::fn_helpcollations()
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指针对简体字UNICODE的排序规则。
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS) 是否区分假名类型,KI不区分,KS区分
_WI(WS) 是否区分宽度 WI不区分,WS区分
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项
三.排序规则的应用:
SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则,但它的应用往往被开发人员所忽略。其实它在实践中大有用处。
例1:让表NAME列的内容按拼音排序:
create table #t(id int,name varchar(20))
insert #t select 1,'中'
union all select 2,'国'
union all select 3,'人'
union all select 4,'阿'
select * from #t order by name collate Chinese_PRC_CS_AS_KS_WS
drop table #t
/*结果:
id name
----------- --------------------
4 阿
2 国
3 人
1 中
*/
例2:让表NAME列的内容按姓氏笔划排序:
create table #t(id int,name varchar(20))
insert #t select 1,'三'
union all select 2,'乙'
union all select 3,'二'
union all select 4,'一'
union all select 5,'十'
select * from #t order by name collate Chinese_PRC_Stroke_CS_AS_KS_WS
drop table #t
/*结果:
id name
----------- --------------------
4 一
2 乙
3 二
5 十
1 三
*/
四.在实践中排序规则应用的扩展
SQL SERVER汉字排序规则可以按拼音、笔划等排序,那么我们如何利用这种功能来处理汉字的一些难题呢?我现在举个例子:
用排序规则的特性计算汉字笔划
要计算汉字笔划,我们得先做准备工作,我们知道,WINDOWS多国汉字,UNICODE目前
收录汉字共20902个。简体GBK码汉字UNICODE值从19968开始。
首先,我们先用SQLSERVER方法得到所有汉字,不用字典,我们简单利用SQL语句就可以得到:
select top 20902 code=identity(int,19968,1) into #t from syscolumns a,syscolumns b
再用以下语句,我们就得到所有汉字,它是按UNICODE值排序的:
select code,nchar(code) as CNWord from #t
然后,我们用SELECT语句,让它按笔划排序。
select code,nchar(code) as CNWord
from #t
order by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,code
结果:
code CNWord
----------- ------
19968 一
20008 丨
20022 丶
20031 丿
20032 乀
20033 乁
20057 乙
20058 乚
20059 乛
20101 亅
19969 丁
..........
从上面的结果,我们可以清楚的看到,一笔的汉字,code是从19968到20101,从小到大排,但到了二笔汉字的第一个字“丁”,CODE为19969,就不按顺序而重新开始了。有了这结果,我们就可以轻松的用SQL语句得到每种笔划汉字归类的第一个或最后一个汉字。
下面用语句得到最后一个汉字:
create table #t1(id int identity,code int,cnword nvarchar(2))
insert #t1(code,cnword)
select code,nchar(code) as CNWord from #t
order by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,code
select A.cnword
from #t1 A
left join #t1 B on A.id=B.id-1 and A.code<B.code
where B.code is null
order by A.id
得到36个汉字,每个汉字都是每种笔划数按Chinese_PRC_Stroke_CS_AS_KS_WS排序规则排序后的
最后一个汉字:
亅阝马风龙齐龟齿鸩龀龛龂龆龈龊龙龠龎庞龑龡龢龝齹龣龥齈龞麷鸾麣龖龗齾齉龘
上面可以看出:“亅”是所有一笔汉字排序后的最后一个字,“阝”是所有二笔汉字排序后的最后一个字......等等。
但同时也发现,从第33个汉字“龗(33笔)”后面的笔划有些乱,不正确。但没关系,比“龗”笔划多的只有四个汉字,我们手工加上:齾35笔,齉36笔,靐39笔,龘64笔
建汉字笔划表(TAB_HZBH):
create table tab_hzbh(id int identity,cnword nchar(1))
--先插入前33个汉字
insert tab_hzbh
select top 33 A.cnword
from #t1 A
left join #t1 B on A.id=B.id-1 and A.code<B.code
where B.code is null
order by A.id
--再加最后四个汉字
set identity_insert tab_hzbh on
go
insert tab_hzbh(id,cnword)
select 35,N'齾'
union all select 36,N'齉'
union all select 39,N'靐'
union all select 64,N'龘'
go
set identity_insert tab_hzbh off
go
到此为止,我们可以得到结果了,比如我们想得到汉字“国”的笔划:
declare @a nchar(1)
set @a='国'
select top 1 id
from tab_hzbh
where cnword>=@a collate Chinese_PRC_Stroke_CS_AS_KS_WS
order by id
id
-----------
8.(结果:汉字“国”笔划数为8)
上面所有准备过程,只是为了写下面这个函数,这个函数撇开上面建的所有临时表和固定表,为了通用和代码转移方便,把表tab_hzbh的内容写在语句内,然后计算用户输入一串汉字的总笔划:
create function fun_getbh(@str nvarchar(4000))
returns int
as
begin
declare @word nchar(1),@n int
set @n=0
while len(@str)>0
begin
set @word=left(@str,1)
--如果非汉字,笔划当0计
set @n=@n+(case when unicode(@word) between 19968 and 19968+20901
then (select top 1 id from (
select 1 as id,N'亅' as word
union all select 2,N'阝'
union all select 3,N'马'
union all select 4,N'风'
union all select 5,N'龙'
union all select 6,N'齐'
union all select 7,N'龟'
union all select 8,N'齿'
union all select 9,N'鸩'
union all select 10,N'龀'
union all select 11,N'龛'
union all select 12,N'龂'
union all select 13,N'龆'
union all select 14,N'龈'
union all select 15,N'龊'
union all select 16,N'龙'
union all select 17,N'龠'
union all select 18,N'龎'
union all select 19,N'庞'
union all select 20,N'龑'
union all select 21,N'龡'
union all select 22,N'龢'
union all select 23,N'龝'
union all select 24,N'齹'
union all select 25,N'龣'
union all select 26,N'龥'
union all select 27,N'齈'
union all select 28,N'龞'
union all select 29,N'麷'
union all select 30,N'鸾'
union all select 31,N'麣'
union all select 32,N'龖'
union all select 33,N'龗'
union all select 35,N'齾'
union all select 36,N'齉'
union all select 39,N'靐'
union all select 64,N'龘'
) T
where word>=@word collate Chinese_PRC_Stroke_CS_AS_KS_WS
order by id ASC) else 0 end)
set @str=right(@str,len(@str)-1)
end
return @n
end
--函数调用实例:
select dbo.fun_getbh('中华人民共和国'),dbo.fun_getbh('中华人民共和国')
执行结果:笔划总数分别为39和46,简繁体都行。
当然,你也可以把上面“UNION ALL”内的汉字和笔划改存在固定表内,在汉字列建CLUSTERED INDEX,列排序规则设定为:
Chinese_PRC_Stroke_CS_AS_KS_WS
这样速度更快。如果你用的是BIG5码的操作系统,你得另外生成汉字,方法一样。但有一点要记住:这些汉字是通过SQL语句SELECT出来的,不是手工输入的,更不是查字典得来的,因为新华字典毕竟不同于UNICODE字符集,查字典的结果会不正确。
用排序规则的特性得到汉字拼音首字母
用得到笔划总数相同的方法,我们也可以写出求汉字拼音首字母的函数。如下:
create function fun_getPY(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @word nchar(1),@PY nvarchar(4000)
set @PY=''
while len(@str)>0
begin
set @word=left(@str,1)
--如果非汉字字符,返回原字符
set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
then (select top 1 PY from (
select 'A' as PY,N'骜' as word
union all select 'B',N'簿'
union all select 'C',N'错'
union all select 'D',N'鵽'
union all select 'E',N'樲'
union all select 'F',N'鳆'
union all select 'G',N'腂'
union all select 'H',N'夻'
union all select 'J',N'攈'
union all select 'K',N'穒'
union all select 'L',N'鱳'
union all select 'M',N'旀'
union all select 'N',N'桛'
union all select 'O',N'沤'
union all select 'P',N'曝'
union all select 'Q',N'囕'
union all select 'R',N'鶸'
union all select 'S',N'蜶'
union all select 'T',N'箨'
union all select 'W',N'鹜'
union all select 'X',N'鑂'
union all select 'Y',N'韵'
union all select 'Z',N'咗'
) T
where word>=@word collate Chinese_PRC_CS_AS_KS_WS
order by PY ASC) else @word end)
set @str=right(@str,len(@str)-1)
end
return @PY
end
--函数调用实例:
select dbo.fun_getPY('中华人民共和国'),dbo.fun_getPY('中华人民共和国')
结果都为:ZHRMGHG
你若有兴趣,也可用相同的方法,扩展为得到汉字全拼的函数,甚至还可以得到全拼的读音声调,不过全拼分类大多了。得到全拼最好是用对照表,两万多汉字搜索速度很快,用对照表还可以充分利用表的索引。
SQL Server的有效安装[2]
排序规则
接下来 你需要选择排序规则设置 SQL Server 中的排序规则(Collation)设置用来管理和语言相关的行为 对象名称和列的值的唯一性 以及排序规则(sorting rules) 在排序规则设置对话框里 你说明排序规则并在SQL Server排序规则和Windows排序规则两者之间选择其一 如果你需要和以前SQL Server版本的向后兼容性 选择SQL Server排序规则——比如 如果你打算在一个早期版本的SQL Server和SQL Server 之间使用复制 否则 选择Windows排序规则 SQL Server 的排序规则设置 不管是Windows或是SQL Server 合并了在先前版本中的 个的设置 字符集 排序次序和Unicode排序规则 除了整合旧的 个设置到一起外 SQL Server 在排序规则中还提供了比以前版本更为强大的灵活性
在你安装SQL Server 时选择的排序规则决定了系统数据库的排序规则设置 要在安装后更该系统数据库的排序规则设置 你需要脚本化所有你的系统对象(比如 登录 消息 工作)并且运行rebuildm exe 它用新的排序规则重建了所有的系统数据库 然而 你不必先导出用户数据库中的所有数据再在运行完rebuildm exe后把他们再导入——就像你再SQL Server 中所作的那样 你只须重新连接用户数据库到SQL Server 你可以用不同于默认服务器的排序规则(这是模板系统数据库的)的排序规则配置你的用户数据库 或者甚至用不同于服务器设置的排序规则连接或恢复一个数据库 你可以以后修改用户数据库的默认排序规则 对于特定的一列 你可以指定不同于默认的数据库排序规则的一种排序规则 你甚至可以稍后修改列的排序规则——如果该列上没有创建索引的话
虽然在排序规则方面SQL Server 是灵活的 不要低估了你在安装时作的选择 正如我前面所言 服务器的排序规则应用到所有的系统数据库并且决定了记录在系统数据库中所有对象(如登录名 数据库名)的排序规则 进一步而言 tempdb的排序规则也是你在安装过程中选择的服务器排序规则 当你创建一个临时表 表的列使用tempdb的排序规则——除非你在每列的定义里指明COLLATE 数据库默认
网络库
在说明了排序规则设置后 你来到了网络库对话框 网络库是客户机应用程序用来和SQL Server通讯的协议 客户机和SQL Server都必须有至少一个匹配的网络库 通过它两者可以通讯 在网络库对话框中 你设置SQL Server将会用来和客户机通讯的网络库
在SQL Server 中 只有命名管道和多协议允许Windows身份验证 所有其他网络库只允许SQL Server身份验证 这样一来 对于SQL Server 来说 你想要支持的登录类型时你选择网络库的一个因素 进一步来说 只有多协议允许数据加密 所以如果你SQL Server 支持数据加密 你就不得不选择这个网络库 在SQL Server 中 所有网络库支持Windows身份验证 在这个意义上你就更加灵活 但是多协议仍然是唯一允许数据加密的网络库
在SQL Server 里 你可以通过使用SQL Server 网络工具和SQL Server客户机网络工具的安全套接字层(Secure Socket Layer SSL)来对所有网络库强制加密 这样一来 加密因素不再决定网络库的选择 同样 在SQL Server 里 多协议不支持命名实例方案(服务器名实例名) 这样的话 当你使用命名实例时 多协议也不是个好的选择 SQL Server 中最通用的网络库大概是TCP/IP套接字吧 它提供了良好的性能 允许Windows身份验证 而且你可以在需要时对它进行强制SSL加密
大多数使用SQL Server早期版本的用户知道SQL Server的默认TCP端口是端口 当使用默认端口时 客户机连接除了服务器名或者IP地址不需要提供端口号 然而 SQL Server 支持多个实例 这无法统统使用同样的端口号 所以当你安装一个命名实例时 安装程序建议把 作为端口号 端口号为 意味着当SQL Server第一次启动时 它动态地选择一个空闲的端口号并且把它永久保留或者直到你稍后手工修改它为止 那么客户机连接如何继续通过仅仅提供服务器名称/IP地址+实例名而不用指定端口号找到SQL Server呢?SQL Server 中的一个服务监听端口 上的客户机请求 然后通过检测请求中的实例名并把它和实例的端口号匹配 再把该请求重定向到适当的实例
无人值守和远程安装
现在我们的标准安装已经完成 让我们讨论一下无人值守安装 Setupsql exe程序让你记录下一个应答文件 它包括了你在安装程序对话框中常选的对于各种安装选项的所有回答 稍后 你能够通过调用以该应答文件作为参数的setupsql exe命令来运行一个安装 这种无需任何用户干预的安装类型被称为无人值守安装
要准备应答文件 先启动安装程序 在安装选择对话框中选择高级选项 在对话框中选择选取 记录无人值守 ISS文件 安装程序会指导你完成常规的安装对话框 其中你可以填入所有你想要记录的选项 当你完成后 安装程序在WINNT文件夹下创建一个名为setup iss的文件
要启动一个无人值守安装 运行setupsql exe程序 用 s作为执行安静安装的参数 fl参数指定一个应答文件 例如 要启动一个安静的 无人值守的安装——安装完成后不通知你 你可以使用以下命令
<path> etupsql exe –s –fl <path> etup iss
如果你想在安装完成时得到通知 从命令行执行如下setupsql exe程序 或者把它写入一个批处理文件中
start /wait <path> etupsql exe s –fl <path> etup iss
直到安装结束 控制才会传递到下一条命令 当你从批处理文件启动安装 而这个文件又包括其他依赖于安装的行为时 使用start /wait选项是特别重要的 例如 假设你要为一个名为INST 的命名实例执行无人值守安装来创建批处理文件 然后启动SQL Server服务 再运行一个用来创建数据库及其对象(如 表 存储过程)的sql脚本 这个批处理文件看起来可能像这样
start /wait D:X etup etupsql exe –s –fl C:WINNT etup iss
net start MSSQL$INST
OSQL /E /I c:data criptscreateappdb sql
如果你不使用start /wait选项 控制从安装一开始就移到了批处理文件的第二条命令 而这条NET START命令试图启动一个还不存在的服务
对一个无人值守安装进行故障排除要比对待标准安装的故障排除更需要慎重对待 标准安装往往在安装程序遇到问题时通过显示一个包含出错信息的对话框(并伴有响亮的警告声)来通知你 而无人值守安装只是简单地终止 且没有交互的通知
要了解如何对无人值守安装进行故障排除 让我们来看一组我遇到过的问题 假设你已经在服务器上完成了另一个产品的安装 然后你试图执行一个SQL Server的无人值守安装 安装程序检测到在前一个安装结束后服务器尚未重启 于是放弃安装 同时没有任何信息提示 如果你保持任务管理器窗口打开 你会注意到setupsql exe 程序不活动 所以SQL Server没有被安装 你也应该检查日志文件 一旦安装成功 WINNT etup log文件应该显示 作为出错代码 然而 在我描述的情景中 他很可能显示 这表示一个基本错误 你也应该看一下出错信息
当执行无人值守安装时 我遇到过多次的另一个错误是 对话框次序紊乱 在我调用安装程序后不久我就意识到这一问题的存在——那是在我打开任务管理器并看到setupsql exe虽然在运行但是没有像正常的无人值守安装那样调用和释放进程 同时 安装程序通常在Program FilesMicrosoft SQL Server下创建的文件夹也没有被创建 Setupsql exe程序看来并没有占用CPU或者I/O资源 只是在大约 分钟后消失了 Setup log文件显示一个 的错误代码而sqlstp log文件显示没有错误——实际上 它看来还未完成 Sqlstp包含了不完整的注意事项 只是一条消息——Begin Action DialogShow<dialogname> BOL显示了以下有关错误代码 的信息 对话框次序紊乱 这是一个常见错误 由在安装初始化文件(Setup iss)文件中的一个对话框次序紊乱所引起 这是由于Setup iss文件创建过程中的系统问题所产生 足以确认 在我重新对Setup iss文件排序后 无人值守安装成功完成
除了完全安装 你还可以执行SQL Server 服务包的无人值守安装 要把服务包应用到默认实例上 从服务包的安装目录调用setupsql exe程序 指明应答文件为位于服务包安装目录根目录下的sql kdef iss 例如 如果服务包安装文件位于c: ql ksq 下 执行入下命令
start /wait c: ql ksp x etup etupsql exe –s –fl c: ql ksp ql kdef iss
要把服务包应用到命名实例上 使用sql knm iss应答文件 但是首先修改文件中的下列两行来对应正确的命名实例
InstanceName = INSTANCE_NAME
NMPPipeName= pipeMSSQL$INSTANCE_NAME qlquery
另一个高级选项——远程安装——让你在一台远程的电脑上安装SQL Server 你可以从一台本地的电脑上手工记录下一个setup iss文件 把它复制到远程电脑上 在激活setupsql exe程序和在远程电脑上的setup iss文件 然而 你可以替自己省些麻烦——通过在本地电脑上运行setupsql exe程序 在电脑名对话框中选择远程电脑 指明你想要安装到的电脑名 当你点击下一步时 远程安装信息对话框会显示出来
首先你要提供帐号细节(用户 密码 域) 到目标文件夹的UNC路径和源安装文件的UNC路径 接下来 安装程序将指引你完成常规安装对话框并根据你的选择记录下setup iss文件 接着 程序复制setup iss文件到目标电脑的WINNT文件夹下 再用复制的setup iss文件来激活setupsql exe
如果你在目标电脑上打开任务管理器 你会看到setupsql exe进程在安装过程中调用和释放其他进程 在本地电脑上 安装程序显示远程安装正在进行中 并且会在完成时通知你
最后的话
虽然基本安装看来简单 你仍需队与你所选择的安装选项给予密切注意 并且完全理解它们 良好的安装选择为运行和管理SQL Server提供了一个坚实的基础 而如果你认为执行无人值守安装和远程安装听起来复杂的话 我希望这篇文章有助于你对它们加深了解
lishixin/Article/program/SQLServer/201311/22413繁体SQL 数据库 简体SQL SERVER 2000
解决的办法是指名排序方式,告诉查询分析器应该怎样排序即可。这里会需要用到一个关键字 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 数据时,排序和比较操作返回不同的结果。
怎样修改sqlserver2005系统数据库排序规则
首先要知道数据库排序规则的含义,如Chinese_PRC_CI_AS就可以不区分大小写了,下面为Chinese_PRC打头的规则:
_BIN
二进制排序
_CI_AI
不区分大小写、不区分重音、不区分假名类型、不区分全半角
_CI_AI_WS
不区分大小写、不区分重音、不区分假名类型、区分全半角
_CI_AI_KS
不区分大小写、不区分重音、区分假名类型、不区分全半角
_CI_AI_KS_WS
不区分大小写、不区分重音、区分假名类型、区分全半角
_CI_AS
不区分大小写、区分重音、不区分假名类型、不区分全半角
_CI_AS_WS
不区分大小写、区分重音、不区分假名类型、区分全半角
_CI_AS_KS
不区分大小写、区分重音、区分假名类型、不区分全半角
_CI_AS_KS_WS
不区分大小写、区分重音、区分假名类型、区分全半角
_CS_AI
区分大小写、不区分重音、不区分假名类型、不区分全半角
_CS_AI_WS
区分大小写、不区分重音、不区分假名类型、区分全半角
_CS_AI_KS
区分大小写、不区分重音、区分假名类型、不区分全半角
_CS_AI_KS_WS
区分大小写、不区分重音、区分假名类型、区分全半角
_CS_AS
区分大小写、区分重音、不区分假名类型、不区分全半角
_CS_AS_WS
区分大小写、区分重音、不区分假名类型、区分全半角
_CS_AS_KS
区分大小写、区分重音、区分假名类型、不区分全半角
_CS_AS_KS_WS
区分大小写、区分重音、区分假名类型、区分全半角
如需要对数据库重新进行规则设定,具体步骤如下:
1、找到sql2005 的安装包
2、执行下面的批处理,指定某种规则,如Chinese_PRC_CI_AS
内容如下:
cd D:\SQL Server 2005\SQL Server x86\Servers
start /wait setup.exe /qb INSTANCENAME=MSSQLSERVER REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=sa SQLCOLLATION=Chinese_PRC_CI_AS
3、重新附加一下数据库就发现排序规则变更了。