热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

隐藏在SQLServer字段中的超诡异字符解决过程

这套系统做了大半年,这个导入导出还是问题不断,我负责的这块导入导出就是夹在网络版和单机版系统之间,只要任何一边对数据库做了改动这个导入导出就会失败。哎,烦心的事不止这些,最近又遇到了一个非常奇怪的问题。

这套系统做了大半年,这个导入导出还是问题不断,我负责的这块导入导出就是夹在网络版和单机版系统之间,只要任何一边对数据库做了改动这个导入导出就会失败。哎,烦心的事不止这些,最近又遇到了一个非常奇怪的问题。

文章作者:jhkdiy
发表日期:2009-10-11
程序架构:B/S
开发环境:Windows XP + IIS6 + VS2003
数 据 库:SQL Server 2000
部分功能:从 SQL Server 中导出数据到 Access。
这套系统做了大半年,这个导入导出还是问题不断,我负责的这块导入导出就是夹在网
络版和单机版系统之间,只要任何一边对数据库做了改动这个导入导出就会失败。哎,烦心
的事不止这些,最近又遇到了一个非常奇怪的问题。
由于之前的导入导出使用SQL Server 支持的OpenDataSource()函数来做,而当遇到
64位系统时就会遇到不支持Microsoft.Jet.OLEDB.4.0 ,所以重新编码,技术步骤是先从SQL Server 读数据到DataTable,然后遍历这个DataTable,对每一行,将里面的数据重新组合成一条Insert 语句,然后打开Access文件链接,执行刚才生成的Insert语句,将数据插入到Access中。
我最终提交给Access执行的语句是根据SQL Server中的数据拼出来,比如SQL Server :select a, b, c from tblTemp
提交给Access执行的语句就是:
代码如下:
Str1 = “Insert into”
Str2 = “tblTemp(a,b,c)values(”
strResult = str1 & str2 & “‘aa', 2, ‘cc' ” & “)” 这回的重大问题是在SQL Server 表的b字段中有特殊字符,此字符使我的程序无法拼出完整的字符串,拼出来的字符串strResult 有时不带最后的“)”,但奇怪的是,这个表总共有4万多条记录,只是组合个别记录才会出现这个现象。但是提交给Access执行肯定不通过,提示SQL语法错误。
我于是查询数据库的这条记录,用查询分析器查询没发现任何的特殊字符,问了同事后才知道,他说之前有过部分表中的某些字符保存了客户输入的回车换行符,我顿时大悟,对呀,回车换行符是看不见的啊,于是,想使用下面的语句查询字段中是否有回车换行符:
代码如下:
select charindex(char(10), demc) from tblgc_jc_de where xh = 15641
select charindex(char(13), demc) from tblgc_jc_de where xh = 15641
select charindex(char(10) + char(13), demc) from tblgc_jc_de where xh = 15641
select charindex(char(13) + char(10), demc) from tblgc_jc_de where xh = 15641 但奇怪的是,返回都是0,也就是找不到。这就郁闷了,字段中到底存储了什么字符啊?,另一个同事教了一招,直接在企业管理器中返回该表的所有行记录,然后全选查看该字段,发现确实是多出一个字符:


现在是时候看看这条记录的物理数据了:


天啊,竟然是0,真不晓得是怎么存进去的。问题终于知道在那了,但是要如何解决呢?最简单的方法就是将这个0替换掉,于是使用下列语句测试:

select replace(demc, char(0), '') as demc from tblgc_jc_de

但是不行,原因是replace函数找不到0这个字符,因为它查找是按两个字节来找的,所以直接在SQL Server上找也找不到这个字符,替换也替换不了。但是,我又想了一下,能不能使用二进制来查找和替换?看了一下资料,使用下面的SQL语句能找出0在该字段的位置:

查是能查出来了,但是我发现replace函数还是不能用,除非是替换4位,也就是0x0038。

最后实在无奈,只能直接把有这个特殊字符的地段截掉一个文字,也就是连那个38也不要了:

select

case when charindex(convert(varbinary(1),0x00),convert(varbinary(200),demc)) > 0

then substring(demc,1,len(demc)-1)

else demc

end as DEMC

from tblgc_jc_de

这就是我现在用的最终解决方案,因为我查询过,4万多条记录中只有8条有这个0在字段里面。所以就算截掉一个文字并影响程序的功能和显示。

虽然我现在写出来很多步骤看似走的很顺,其实这个问题我用了几天时间了,主要是找问题所在耗费了不少时间。现在给出此文希望广大朋友在找这些问题时多个方向,因为存储在字段中的特殊字符不一定就是常规的回车换行符,也有可能是其它字符,在此大家互相学习提高吧。

推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
北若久
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有