上面两条查询语句的结果是一样的巴黎人手机版
分类:巴黎人-数据库

在写sql的查询时 如下:

这两天测量试验Job时,在SQL中冒出了个 “无法解决 equal to 操作的排序法规顶牛”,百度了弹指间,才意识是七个表之间成分创制时排序准则不一,贰个是collate Chinese_PRC_CI_AI_WS,一个为COLLATE SQL_Latin1_General_CP1_CI_AS。

没辙化解 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间 2011-03-11 15:26:57

力不胜任减轻 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间 2011-03-11 15:26:57

    我们在 create table 时经常会凌驾那样的口舌,举例:password nvarchar(10)collate chinese_prc_ci_as null,那它到底是怎样看头呢?无妨 看看下面: 首先,collate 是二个子句,可选用于数据库定义或列定义以定义排序准绳,或 应用于字符串表明式以应用排序法规投影. 语法是 collate collation_name collation_name ::={windows_collation_name}|{sql_collation_name} 参数 collate_name 是使用于表达式,列定义或数据库定义的排序准则的名称. collation_name 能够只是点名的 Windows_collation_name 或 SQL_collation_name. Windows_collation_name 是 Windows 排序法规的排序法规名称. 参见 Windows 排序法则名称. SQL_collation_name 是 SQL 排序法则的排序准则名称.参见 SQL 排序法则名 称. 上边简要介绍一下排序法则: 什么叫排序法规吧?MS 是那样描述的:"在 Microsoft SQL Server 三千 中, 字符串的情理存储由排序准绳调整. 排序法则钦命表示每种字符的位格局以及存款和储蓄和比较字符所使用的准绳." 在查询深入分析器内实践下边语句, 可以获得 SQL SEKugaVEEscort 帮助的装有排序准则. 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 SEKoleosVEQX56的排序法则平常应用不是成百上千,可能相当多初学者还比较不熟悉,但有 三个张冠李戴大家应是日常遭受: SQL SEPRADOVEEvoque 数据库,在跨库多表连接查询时,若 两数目 库私下认可字符集不相同,系统就能回去那样的荒唐: "不恐怕化解 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 两千 中, 字符串的大意存款和储蓄由排序法规调控. 排序准绳内定表示每一种字符的位情势以及存款和储蓄和比较字符所使用的准则." 在查询解析器内推行上边语句, 可以拿走 SQL SE奥德赛VESportage 协理的具备排序法规. 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 SE奥迪Q7VEWrangler 提供了大气的 WINDOWS 和 SQLSELacrosseVECRUISER专项使用的排序法规,但它的 应用往往 被开垦人士所忽略.其实它在施行中山高校有用处. 例 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 SEMercedes-迈巴赫VE奇骏汉字排序准绳能够按拼音,笔划等排序,那么我们怎么着运用那 种功效来管理汉字的部分难点吗?笔者今后举例: 用排序准则的特色计算汉字笔画 要计算汉字笔画,大家得先做准备干活,大家精通,WINDOWS 多国汉字, UNICODE 近期 收音和录音汉字共 20902 个.简体 GBK 码汉字 UNICODE 值从 一九九八8 起头. 首先,大家先用 SQLSE奥德赛VE索罗德 方法获得全部汉字,不用字典,大家差不离利用 SQL 语句就 能够取得: select top 20902 code=identity(int,一九九八8,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 ----------一九九六8 三千8 20042 20001 二零零三2 贰零零壹3 二〇〇七7 二零零六8 二零零五9 20091 19999 .......... CNWord -----一 丨 丶 丿 乀 乁 乙 乚 乛 亅 丁 从上边的结果, 大家得以明白的看出, 一笔的汉字, code 是从 一九九八8 到 20081, 从小到大排,但到 了二笔汉字的率先个字"丁",CODE 为 一九九九9,就不按梯次而重复早先了.有了 那结果,我们就能够轻 松的用 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 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 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(5000)) 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 一九九六8 and 一九九九8+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(五千)) returns nvarchar(陆仟) as begin declare @word nchar(1),@PY nvarchar(陆仟) set @PY='' while len(@str)>0 begin set @word=left(@str,1) --若是非汉字字符,再次回到原字符 set @PY=@PY+(case when unicode(@word) between 壹玖玖捌8 and 一九九六8+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 '昂科威',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

 select * from Users where username='WangE'

顺手引用下作品作参照他事他说加以考察:“无法缓和 equal to 操作的排序准则冲突。”的荒谬深入分析和平消除决办法

分拣: 数据库开垦本事

分拣: 数据库开采技艺

 select * from Users where username='wange'

SQL SE逍客VECR-V的排序法则平时应用不是无尽,恐怕十分多初学者还比较素不相识,但有
四个谬误大家应是常事蒙受: SQL SETiguanVEGL450数据库,在跨库多表连接查询时,若两数据
库暗中同意字符集差异,系统就能够回去那样的不当:

2011年03月10日

2011年03月10日

地点两条查询语句的结果是同等的,那说明username的尺码并不曾差距轻重缓急写。

“不可能消除 equal to 操作的排序法规争辨。”

CCE3.03的服务器选拔意大利共和国语的二〇〇四LX5702 数据库排序准则为拉丁文忽略大小写.

CCE3.03的服务器采纳拉脱维亚语的二零零四Odyssey2 数据库排序法规为拉丁文忽略大小写.

 

一.谬误深入分析:
  这些错误是因为排序准绳不雷同导致的,我们做个测量检验,比方:
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,
value int)

小编的蕴藏进度中遇见了"无法缓和 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序准则争持。"百度时而 ^_^

我的蕴藏进程中相见了"无法消除 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序准则争论。"百度时而 ^_^

若要使用方面包车型大巴的口舌能够执行按界别轻重缓急写查询 须要在查询的最后加上 collate Chinese_PRC_CS_AI_WS

create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,
value int )

是因为采纳了 一时表 导致使用了数据库私下认可的字符排序准绳 导致:

出于采纳了 不时表 导致使用了数据库暗中认可的字符排序准则 导致:

总体语句是:

表建好后,实践连接查询:

表sohead字段so_num的Collate跟数据库默许的Collate不等同导致的,创造一时表,对字符类型的字段使用数据库暗中认可的Collate,假使这几个跟表的字段Collate不一样一时间,SQL Server无法对那七个字段进行相比
解决:把sohead字段so_num的Collate改成跟数据库暗中同意的同等,恐怕改数据库暗中同意的Collate,或然成立有的时候表时钦赐Collate

表sohead字段so_num的Collate跟数据库暗中认可的Collate不雷同导致的,创造有时表,对字符类型的字段使用数据库默许的Collate,要是这些跟表的字段Collate差异偶然间,SQL Server无法对那八个字段进展相比
解决:把sohead字段so_num的Collate改成跟数据库私下认可的平等,恐怕改数据库默许的Collate,可能创立一时表时钦赐Collate

select * from Users where username='WangE' collate Chinese_PRC_CS_AI_WS

select * from #t1 A inner join #t2 B on A.name=B.name

附录:

附录:

这般,错误就出现了:

在实践SQL语句时,大概会遇到:“不或然解决 equal to 操作中的 **** 和 *******排序准则冲突”

在实施SQL语句时,大概会遇见:“不能消除 equal to 操作中的 **** 和 *******排序法则冲突”

服务器: 消息 446,级别 16,状态 9,行 1
爱莫能助缓慢解决 equal to 操作的排序法则争执。
  要解除那一个错误,最简便易行方法是,表连接时钦定它的排序准绳,那样错误就
不再出现了。语句那样写:

一.错误深入分析:
本条错误是因为排序法规不均等导致的,大家做个测验,比方:
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,
value int)

一.错误深入分析:
其一错误是因为排序准绳不平等导致的,大家做个测验,比如:
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,
value int)

本文由巴黎人手机版发布于巴黎人-数据库,转载请注明出处:上面两条查询语句的结果是一样的巴黎人手机版

上一篇:指定登录用户,进入远程主机的数据库 下一篇:没有了
猜你喜欢
热门排行
精彩图文