如何在2000中处理半个汉字的问题

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

/*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))

returns varchar(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)去掉半个汉字

 

带有半个汉字  长度   去掉半个汉字  长度          1 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值