小妖女 发表于 2015-1-16 22:48:52

MYSQL编程:怎样在SQL Server2000中处置半个汉字的...

如果你需要额外的功能的话,MySQL的普及性实际上可以让你发现总有一个厂商会提供准确的解决方案,而这个方案会满足你的需要和需求。server|汉字|成绩
/*writtenbyenydraboy,2003-07-17*/
/*宣布于CSDN*/
/*转载请说明出处和保存此版权信息*/

在csdn的专家论坛中,看到有一名伴侣问起关于“因为从别的数据库中导进的数据存在半个汉字的成绩,以是但愿能在查询语句中将这半个汉字处置失落,怎样处置都行。看列位妙手不惜见教!”的成绩,启初有点不测,可是厥后以为从这个成绩能够带出一些SQLServer汉字中存储和处置的办法,以为有需要总结一下。

汉字是由两个字节存储的,每一个字节的数值都>127。以是下面的成绩的办理计划就是:把字符串按字节按次截取,当呈现第一个字节是>127,可是前面一个字节是<127的这类情形,就抛弃失落。

接上去,我们要明白些手艺细节:

(1)在SQLServer中有良多字符串相干的操纵函数,可是间接往操纵包括了汉字的字符串,会有点成绩。申明以下:LEN盘算长度的时分,会把汉字和英笔墨符都当作长度一样的;substring也是如许,ascii是前往第一个字节的ASCII码。

Example:

selectlen(你好a),substring(你好a,1,1),ascii(你)

了局是



--------------------------

3你196

必定要把字符串要转换成varbinary来处置,才能够。



(2)SQLServer中,怎样把ASCII码组分解汉字,就是把高字节和底字节分离转成字符再拼接起来。如char(210)+char(166)就是姚这个汉字。

再明白了下面的手艺细节后,接上去就能够办理成绩了。我经由过程编写一个函数来办理成绩。

createfunctionfn_TruncSemiHanzi(@strvarchar(4000))

returnsvarchar(8000)

as

begin

declare

@sTmpvarchar(8000),@iint,@itmpint,@itmp2int,@stmp2varchar(2)

select@sTmp=

select@i=1

while@i<=len(@str)

begin

select@itmp=convert(int,substring(convert(varbinary,substring(@str,@i,1)),1,1))--截取一个字节

if@itmp>127

begin

--年夜于127反省前面一个字节

select@itmp2=convert(int,substring(convert(varbinary,substring(@str,@i,1)),2,1))

if@itmp2>127

begin

select@stmp2=char(@itmp)+char(@itmp2)--是一个完全的汉字

end

else

begin

select@stmp2=char(@itmp2)--抛弃半个汉字

end

end

else

begin

select@sTmp2=char(@itmp)

end

select@sTmp=@sTmp+@stmp2

select@i=@i+1

end

return@stmp

end

测试以下:

DECLARE@strvarchar(4000)

--设置参数值

--设置参数值

--带有半个汉字,是你这个汉字的后面一部分

select@str=b+char(convert(int,substring(convert(varbinary,你),1,1)))+a你

select@str带有半个汉字,dbo.fn_TruncSemiHanzi(@str)往失落半个汉字



带有半个汉字长度往失落半个汉字长度

---------------------------------------------------------------

ba你3ba你3



我们还能够发明如许一个风趣的征象,因为我是截了半个汉字出来,了局你的前半个汉字的字符和前面一个英笔墨母a组合,成了一个怪怪的字符a。

总结,经由过程这个成绩的办理,人人能够懂得汉字在SQLServer2000中存储和处置的基础办法,像怎样辨别一个字符串中是不是包括了汉字,和分别字符串中中文和英文都能够套用本文中办法。
本文中测试的情况是Win2000Server(中文)+SQLServer2000(中文),英文情况下没有测试,若有成绩,接待人人斧正。当然,或许这并不是我们拒绝MySQL的一个有说服力的MySQL学习教程,但是对于一些比较守旧的IT经理来说,在为一些关键业务选择平台的时候,平台的成熟性却是必须要考虑的一个因素,在这一点上,MySQL无疑毫无优势。

活着的死人 发表于 2015-1-20 05:02:55

无法深入到数据库系统层面去了解和探究

兰色精灵 发表于 2015-1-25 16:10:26

入门没那么困难,精通没那么容易

乐观 发表于 2015-2-3 06:06:41

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。

山那边是海 发表于 2015-2-8 19:52:34

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。

谁可相欹 发表于 2015-2-26 00:14:10

比如日志传送、比如集群。。。

透明 发表于 2015-3-8 10:44:24

sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西

小妖女 发表于 2015-3-15 22:07:51

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

精灵巫婆 发表于 2015-3-22 06:08:15

呵呵,这就是偶想说的
页: [1]
查看完整版本: MYSQL编程:怎样在SQL Server2000中处置半个汉字的...