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

原创 2003年07月18日 07:02:00

/* 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(中文),英文环境下没有测试,如有问题,欢迎大家指正。

在SQL Server2000中处理半个汉字的问题(1)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月30日 06:29
  • 153

在SQL Server2000中处理半个汉字的问题(2)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月30日 06:28
  • 212

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

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 20:38
  • 199

搞定SourceInsight的半个汉字的问题

搞定SourceInsight的半个汉字的问题 “SourceInsight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析。SourceIns...
  • nyist327
  • nyist327
  • 2015年01月05日 10:59
  • 3281

解决SourceInsight的半个汉字的问题

通常安装完的SourceInsight一次只能删除半个汉字的问题 确实情况下,Source Insight删除汉字时是半个半个删除的,删除一半的汉字显示为乱码,在写注释时非常讨厌,最后在网上找到...
  • dearwind153
  • dearwind153
  • 2014年06月16日 17:10
  • 2068

如何向SQL Server 2005中插入中文

如何向SQL Server 2005中插入中文?向SQL Server 2005中插入中文数据后,查询出来的结果是???,根本就不显示中文解决方法:1 关于数据库排序规则,将SQL_Latin1_Ge...
  • zhou584859552
  • zhou584859552
  • 2011年05月23日 11:16
  • 1967

解决Delphi截取字符串时遇到半个汉字

演示程序中主要是用了 IsDBCSLeadByte 这个 API 来判断某字节是否在双字节字符集(例如汉字)的前导字节集中(GB 2312-80 汉字编码中的第一个字节范围 0xA1-0xFe) pr...
  • shazhuyubaichi
  • shazhuyubaichi
  • 2010年08月10日 11:53
  • 3049

在SQL Server 2000中处理半个汉字的问题

 问:由于从其它数据库中导入的数据存在半个汉字的问题,所以希望能在查询语句中将这半个汉字处理掉,请问怎样才能解决这个问题?   答:“汉字是由两个字节存储的,每个字节的数值都>127。所以上面问题的...
  • zhangj1012003_2007
  • zhangj1012003_2007
  • 2010年11月10日 12:48
  • 501

oracle导入半个汉字的问题

最近在一次数据采集过程中遇到一个难题,真正来说不是遇到是最近才发现,原来一直都存在可能没太注意,我先来描述一下吧。我们这个系统需要数据是由上游系统给的,这些数据以文本文件以定长格式给出,这就是我们的源...
  • hnbcjzj
  • hnbcjzj
  • 2010年06月12日 15:13
  • 2055

java根据字节 截取字符串,保证汉字不被截取半个

编写一个截取字符串的函数,输入一个字符串和字节数。然后输出字符串,要保证汉字不被截取半个,如:我ABC,4 应截取 “我AB”    首先要了解中文字符有多种编码及各种编码的特征  假设n为截取...
  • yinxianluo
  • yinxianluo
  • 2014年04月14日 20:05
  • 2013
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在SQL Server2000中处理半个汉字的问题
举报原因:
原因补充:

(最多只允许输入30个字)