转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> 其他 >> 正文
如何在SQLServer2000中处理半个汉字的问题         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:820 更新时间:2009/4/22 23:21:57

/* written by enydraboy ,2003-07-17 */
/*发表于CSDN */
/* 转载请注明出处和保留此版权信息 */

在csdn的专家论坛中,看到有一位朋友问起关于“由于从其它数据库中导入的数据存在半个汉字的问题,所以希望能在查询语句中将这半个汉字处理掉,怎么处理都行。望各位高手不吝赐教!”的问题,启初有点意外,但是后来觉得从这个问题可以带出一些SQL Server汉字中存储和处理的方法,觉得有必要总结一下。

汉字是由两个字节存储的,每个字节的数值都>127。所以上面的问题的解决方案就是:把字符串按字节顺序截取,当出现第一个字节是>127,但是后面一个字节是<127的这种情况,就丢弃掉。

接下来,我们要明确些技术细节:

(1) 在SQL Server中有很多字符串相关的操作函数,但是直接去操作包含了汉字的字符串,会有点问题。说明如下:LEN计算长度的时候,会把汉字和英文字符都看成长度一样的;substring也是这样,ascii是返回第一个字节的ASCII 码。

Example:

select len('你好a'),substring('你好a',1,1),ascii('你')

结果是

                            

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

3           你          196

一定要把字符串要转换成varbinary来处理,才可以。

 

(2) SQL Server中,如何把ASCII码组合成汉字,就是把高字节和底字节分别转成字符再拼接起来。如char(210)+char(166)就是姚这个汉字。

再明确了上面的技术细节后,接下来就可以解决问题了。我通过编写一个函数来解决问题。

create function fn_TruncSemiHanzi(@str varchar(4000))

returns  varchar(8000)

as

begin

declare

@sTmp varchar(8000),@i int,@itmp int,@itmp2 int ,@stmp2 varchar(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 @str varchar(4000)

-- 设置参数值

-- 设置参数值

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

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

select @str  带有半个汉字,dbo.fn_TruncSemiHanzi(@str) 去掉半个汉字

 

带有半个汉字   长度    去掉半个汉字   长度         

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

b腶你          3      ba你             3

 

我们还可以发现这样一个有趣的现象,由于我是截了半个汉字出来,结果你的前半个汉字的字符和后面一个英文字母a 组合,成了一个怪怪的字符腶。

总结,通过这个问题的解决,大家可以了解汉字在SQL Server2000中存储和处理的基本方法,像如何区分一个字符串中是否包含了汉字,和分离字符串中中文和英文都可以套用本文中方法。

本文中测试的环境是Win2000 Server(中文)+SQL Server 2000(中文),英文环境下没有测试,如有问题,欢迎大家指正。  


[系统软件]如何在Linux系统上进行快速磁带备份  [C语言系列]如何在Jbuilder9中使用SQLServer JDBC驱动
[VB.NET程序]如何在Visual Basic 6.0 中连接加密的Access数据库  [VB.NET程序]如何在vb 中用api函数代替winsock控件建立网络连接…
[Delphi程序]如何在delphi6中调试web程序  [Delphi程序]如何在Delphi中用代码来完成计算字段的创建
[Delphi程序]如何在 Listbox 上显示 In-place Tooltips  [Delphi程序]如何在Delphi应用程序中调用CHM文档
[Delphi程序]如何在Delphi中使用正则表达式  [Delphi程序]如何在delphi下和.net建立的webservice 进行协同工…
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台