|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你需要额外的功能的话,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无疑毫无优势。 |
|