仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 974|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL教程之利用COMPOSE和UNISTR 创立沉音字符

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:38:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁创立
良多言语,包含英语在内,都利用沉音字符(accentedcharacter)。由于这些字符不属于ASCII字符集,以是假如不检察Unicode值也不利用Unicode编纂器并将其转成一个已知字符集,就很难编写利用这些字符的代码。

Oracle9i引进了COMPOSE函数,该函数承受一串Unicode字符并划定规矩化其文本。这就意味着它能够承受一个字母和一个组合标志,好比说‘a(Unicode字符0097)和沉音符(Unicode字符0300),然后创立一个独自的由两个标志组合而成的字符。COMPOSE利用特别的组合标志,而没有利用ASCII中响应的音节标志,它所利用的特别的组合标志是Unicode尺度的一部分。下面的例子的了局应当是Unicode字符00E0(有一个沉音符的小写拉丁字母‘a)。

在ANSI中最多见的组合字符有:

·U+0300:沉音符(graveaccent)(`)

·U+0301:重音符(acuteaccent)()

·U+0302:顿挫音标记(circumflexaccent)(^)

·U+0303:颚化标记(tilde)(~)

·U+0308:元音变音

假如没有特别的软件大概键盘驱动程序的话,很难在键盘上输出Unicode字符0097和0300。因而,以纯ASCII文本输出Unicode序列的一个办法是利用UNISTR函数。这个函数承受一个ASCII字符串然后以国度字符集(一般作为16位Unicode大概UTF-8字符集安装)创立一个Unicode字符的序列。它利用十六进制占位符序列映照任何非ASCII字符,映照体例与Java相似。

要输出a后接一个沉音符组合字符的序列,可使用UNISTR(‘a300),而不要试图间接在代码中输出字符。这个函数在任何字符集和任何具有基于Unicode的国度字符集的数据库下都能够一般运转。能够将多个组合字符放在函数中——能够在UNISTR函数中夹杂利用ASCII和Unicode占位符。比方,能够像上面如许利用UNISTR函数:

selectCOMPOSE(UNISTR(Unlessyouarenai308ve,meetmeatthecafe301with
yourre301sume301.))fromdual;

在将UNISTR函数的输入与COMPOSE组应时,能够在不查找任何值的情形下天生一个Unicode字符。比方:

selectitistrueifcompose(unistr(a300))=unistr(0e0);

COMPOSE函数前往一个NVARCHAR2字符串,前往的NVARCHAR2字符勾通常是基于Unicode的。假如是在当地利用这些字符,在了局中具有一个隐式地TO_CHAR时,数据库将实验将Unicode字符映照到当地字符集。不是一切的字符都能够被映照,有一些字符组合在COMPOSE中不克不及事情,由于Unicode协会没有在Oracle所用的级别界说它们。

要疾速地反省字符怎样在一个特定的情况下查询,能够运转一个与上面的剧本相似的剧本,以检察在输入组合字符怎样被映照。你大概必要断定一下NLS_LANG设置以确保这些字符准确地前往:

createorreplacetypehexrange_tblastableofvarchar2(4);
/
showerrors;

createorreplacefunctionhexrange(n1varchar2,n2varchar2)
returnhexrange_tblpipelined
is
begin
foriinto_number(n1,000X)..to_number(n2,000X)loop
piperow(to_char(i,FM000X));
endloop;
return;
endhexrange;
/
showerrors;

selectcolumn_valuecomposer,
compose(unistr(a||column_value))a,
compose(unistr(c||column_value))c,
compose(unistr(e||column_value))e,
compose(unistr(i||column_value))i,
compose(unistr(n||column_value))n,
compose(unistr(o||column_value))o,
compose(unistr(r||column_value))r,
compose(unistr(s||column_value))s,
compose(unistr(u||column_value))u,
compose(unistr(y||column_value))y
fromtable(hexrange(0300,0327))x;

上面放松一下,这里有一小段PL/SQL剧本,这段剧本利用COMPOSE和UNISTR创立一种特别效果,良多SMS用户、黑客和渣滓邮件发送者都利用这类效果使可读英文文本难于扫描,由于它利用字符重音版本的一个随机序列。我利用DBMS_RANDOM随机拔取一个可由分歧字符利用的组合字符,然后让SQL举行组兼并举行反向转换以天生ANSI/Latin-1输入。这段剧本在代码中利用了EMP表的ENAME字段。

setserveroutputon;
declare
--thesecombinationsworkunderANSI,atleast
a_combnvarchar2(50):=unistr(30030130230330830A);
c_combnvarchar2(50):=unistr(327);
e_combnvarchar2(50):=unistr(300301302308);
i_combnvarchar2(50):=unistr(300301308);
n_combnvarchar2(50):=unistr(303);
o_combnvarchar2(50):=unistr(300301302303308);
u_combnvarchar2(50):=unistr(300301302308);
y_combnvarchar2(50):=unistr(301308);
l_idxinteger;
l_enamenvarchar2(50);
chnchar;
l_junkvarchar2(50);
begin
dbms_random.initialize(to_char(sysdate,SSSSS));
forrowin(selectenamefromemp)loop
l_ename:=row.ename;
l_junk:=null;
foriin1..length(l_ename)loop
ch:=substr(l_ename,i,1);
caselower(ch)
whenathen
l_junk:=l_junk||compose(ch||substr(a_comb,
mod(abs(dbms_random.random),length(a_comb))+1,1));
whencthen
l_junk:=l_junk||compose(ch||substr(c_comb,
mod(abs(dbms_random.random),length(c_comb))+1,1));
whenethen
l_junk:=l_junk||compose(ch||substr(e_comb,
mod(abs(dbms_random.random),length(e_comb))+1,1));
whenithen
l_junk:=l_junk||compose(ch||substr(i_comb,
mod(abs(dbms_random.random),length(i_comb))+1,1));
whennthen
l_junk:=l_junk||compose(ch||substr(n_comb,
mod(abs(dbms_random.random),length(n_comb))+1,1));
whenothen
l_junk:=l_junk||compose(ch||substr(o_comb,
mod(abs(dbms_random.random),length(o_comb))+1,1));
whenuthen
l_junk:=l_junk||compose(ch||substr(u_comb,
mod(abs(dbms_random.random),length(u_comb))+1,1));
whenythen
l_junk:=l_junk||compose(ch||substr(y_comb,
mod(abs(dbms_random.random),length(y_comb))+1,1));
else
l_junk:=l_junk||ch;
endcase;
endloop;
dbms_output.put_line(to_char(l_junk));
endloop;
end;
/
showerrors;
恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。
谁可相欹 该用户已被删除
沙发
发表于 2015-1-28 10:13:35 | 只看该作者
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
老尸 该用户已被删除
板凳
发表于 2015-2-5 17:17:31 | 只看该作者
从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-13 01:45:55 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
蒙在股里 该用户已被删除
5#
发表于 2015-3-3 12:41:16 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
莫相离 该用户已被删除
6#
发表于 2015-3-11 11:03:04 | 只看该作者
入门没那么困难,精通没那么容易
小女巫 该用户已被删除
7#
发表于 2015-3-18 07:38:39 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
不帅 该用户已被删除
8#
发表于 2015-3-25 13:28:47 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 18:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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