`
haiyupeter
  • 浏览: 427529 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

问:由于从其它数据库中导入的数据存在半个汉字的问题,所以希望能在查询语句中将这半个汉字处理掉,请问怎样才能解决这个问题?

答: 汉字是由两个字节存储的,每个字节的数值都 >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( 中文 ) ,英文环境下没有测试,如有问题,欢迎大家指正。

 

// 转换成字符型后加上一个 0

declare   @i   int   
  set   @i=1   
    
  select   right('0'+cast(@i   as   varchar),2)   
    
  select   right(cast(@i+100   as   varchar),2)

分享到:
评论

相关推荐

    SQL Server 2000中文版基础教程

    SQL Server 2000提供了一个强大而稳定的平台,用于存储、管理、检索和分析大量结构化和半结构化数据。它支持多种数据库模型,包括关系模型,能够处理复杂的事务处理和数据查询需求。 二、安装与配置 在安装SQL ...

    SQL_Server_2005全文检索技术

    SQL Server 2005将索引存储在文件系统中,每个表仅支持一个全文索引,通过关键字进行高效检索。 全文检索与传统的关系数据库查询、多维数据查询和XML查询有显著区别。关系数据库查询主要处理结构化数据,而全文检索...

    SQL SERVER字段类型说明

    在 SQL Server 数据库系统中,字段类型的选择对于确保数据的正确存储与高效处理至关重要。合理的字段类型不仅能够优化存储空间,还能提升查询性能,并有助于保障数据的完整性和一致性。本文将详细介绍 SQL Server 中...

    sqlserver服务账户和权限管理配置.doc

    全文搜索是 SQL Server 的一个组件,用于对构造化和半构造化数据的容和属性快速创立全文索引,从而为 SQL Server 提供文档筛选和断字功能。 (ix)SQL 编写器 SQL 编写器是 SQL Server 的一个组件,用于允备份和复原...

    SQL-Server数据库-数据库的基本概念.pdf

    SQL具有数据查询、操纵、定义和控制四大功能,不同数据库管理系统如SQL Server的Transact-SQL和Oracle的PL-SQL虽然都基于SQL,但会有特定的扩展和差异,不完全兼容。 在数据库设计中,概念结构设计是关键步骤,它...

    scrapy+sqlserver+mongodb 论文数据采集,支持中英双文解析.zip

    这个压缩包文件“scrapy+sqlserver+mongodb 论文数据采集,支持中英双文解析.zip”包含了一个名为“weipu-master”的子项目,该子项目提供了一整套的数据采集、处理和显示的工具。 **Scrapy框架** Scrapy是一个...

    sql 2005 XML的加强

    SQL Server 2005是微软推出的一款关系型数据库管理系统,它在XML支持方面相...这些功能使得数据库管理员和开发人员能够更有效地管理和操作XML数据,进一步提升了SQL Server在处理复杂数据结构和集成异构系统时的能力。

    学生信息管理系统sql

    当在SQL Server中进行跨库多表连接查询时,如果两个数据库的默认字符集不同,可能会遇到以下错误: ```plaintext “无法解决equalto操作的排序规则冲突。” ``` **2.1 错误原因** 这个错误主要是因为两个表的排序...

    SQL2005CLR函数扩展 - 关于山寨索引

    虽然这种方法在小规模应用中可能有效,但在处理大量数据或复杂搜索需求时,其性能和实用性可能受到限制。更高级的解决方案,如使用Lucene或其他专门的全文搜索引擎,通常能提供更好的性能和功能。

    mysql分卷备份程序

    当数据库中存在字段长度超过某个限制的汉字字符串时,备份过程中可能会出现半个汉字被保存,导致后续的字符丢失。这是由于备份过程中字段处理不当,未充分考虑字符串编码和长度限制所引起的。为解决这个问题,需要在...

    MySQL Server 5.5.zip

    MySQL Server 5.5是MySQL数据库管理系统的一个重要版本,它在2010年发布,提供了许多增强功能和性能优化,对于开发人员来说是一个理想的选择。这个压缩包包含的是5.5.62版本,这是MySQL 5.5系列的一个稳定版本,发布...

    Access+2000中文版高级编程

    7.9 错误处理问题的最后回顾 171 7.9.1 注意环境开关 171 7.9.2 使用错误处理程序回卷事务 174 7.9.3 使用窗体的On Error事件 175 7.9.4 嵌套错误处理程序 177 7.9.5 错误处理的新选项 177 7.10 小 结 ...

    存储过程

    `xp_cmdshell`是一个系统存储过程,允许在SQL Server中执行操作系统命令。为了启用它,你需要在SQL Server Management Studio中修改服务器配置。打开“SQL Server配置管理器”,选择“SQL Server配置器”-&gt;“SQL ...

    Access 2000中文版高级编程(part1)

    7.9 错误处理问题的最后回顾 171 7.9.1 注意环境开关 171 7.9.2 使用错误处理程序回卷事务 174 7.9.3 使用窗体的On Error事件 175 7.9.4 嵌套错误处理程序 177 7.9.5 错误处理的新选项 177 7.10 小 结 178 第...

    Couchbase_Server_An_Architectural_Overview.pdf

    Couchbase Server 是一种分布式的NoSQL文档型数据库,它支持灵活的数据模型、基于SQL的强大查询语言,并且构建了一个安全的数据库平台核心。它的核心架构设计简化了使用弹性数据模型、强大查询语言和安全核心数据库...

    各个数据库管理系统的特点.docx

    - **持续更新**: SQL Server自1988年推出以来,经历了多次重大版本更新,例如SQL Server 6.5、SQL Server 7.0、SQL Server 2000直至最新的SQL Server 2012版本。 - **企业级特性**: Microsoft为SQL Server添加了许多...

    70-583 Windows Azure 题库

    - **问题描述**:设计一个策略,用于同步SQL Azure数据库与多个远程的Microsoft SQL Server 2008数据库之间的数据。其中SQL Azure数据库包含许多具有循环外键关系的表。 - **技术要点**: - **同步机制**:考虑到...

Global site tag (gtag.js) - Google Analytics