求助sql数据库字段特殊字符问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助sql数据库字段特殊字符问题相关的知识,希望对你有一定的参考价值。

哪个天杀的数据库管理员,将字段名带上了特殊符号英文句号。如:15.工资,我编个“select 15.工资........”,工资查询结果全是15,请教怎么处理字段中“.”这个特殊符号?怎么用sql语句编查询语句?其它特殊符号如何处理(有加分)?

参考技术A 我有一个是因为表字段重命名为这种格式[dbo].[MembercertnoinfoCheck1].name 然后select 的时候必须是这样的[[dbo]].[MembercertnoinfoCheck1]].name] 其实实在不知道的时候,你可以直接把这个表的创建脚本拿出来 上面的字段显示就是正确的格式了 参考技术B 你给字段加个 [15.工资] 应该就可以了本回答被提问者采纳

因字段包含特殊字符,导致ERP系统部分操作报错的原因处理办法与思考

一、前言(可跳过)

在ERP系统中,用户录入的数据最终通过sql语句写入数据库,如果录入的数据包含特殊字符,可能导致执行出错。

最容易引起错误的字符是英文单引号(半角单引号),如果没有对这种字符做处理,sql语句会被截断,导致出错。

例如如下语句,当用户对某个字段录入 888‘8 的时候(注意中间有一个单引号),没有经过特殊处理的语句将是:

update T_AP_PAYBILLENTRY set FOPPOSITEBANKACCOUNT=8888 where FENTRYID=100004

结果会报错:

技术图片

针对解决这个问题,系统对于用户录入字段中包含的单引号,会进行自动转义或替换,避免出错。

例如上述语句,在金蝶云星空中,系统会进行替换,将一个单引号替换为两个再执行,具体如下:

update T_AP_PAYBILLENTRY set FOPPOSITEBANKACCOUNT=888‘‘8 where FENTRYID=100004

所以,通常情况下,用户可以在自由的录入特殊字符,下推下游单据也不会报错,因为这些情况都被考虑进去了。

但百密终有一疏,如果开发者在某些场景没有考虑到这个问题,直接去复制含有了特殊字符的表,就会导致报错。

二、报错案例:金蝶云星空审核付款单报错(个人实践)

金蝶云星空中,付款申请单可以录入对方银行账号,由于用户可能直接从excel复制粘贴,导致账号含有单引号: 

技术图片

保存的时候不会报错、下推到付款单的时候也不会报错,因为开发者考虑到了这个问题,所以都可以正常保存。

但审核付款单时,由于系统会将账号信息写入“历史收款明细表",而后台语句没有考虑特殊字符,就导致报错:

 技术图片

解决办法是,去掉”对方银行账户”的这个特殊字符,就可以正常审核,但这样治标不治本,可以配置单据保存时校验来提示,如果用户录入英文单引号,保存的时候就会提示,可以控制在付款申请单或者付款单。

配置方法:BOS-编辑-批量编辑字段属性-左侧选择表单属性-右侧选择菜单集合-新窗口左侧选择保存按钮-右侧选择点击事件-点击修改按钮-弹出窗口再次点击修改-点击其他控制-选择校验规则,最后新增一条规则:

  • 服务名称:选择正则表达式。
  • 前置条件:不用选择。
  • 描述:根据需要,可以录入“对方银行账号请不要录入英文单引号”。
  • 校验级别:错误,立刻终止。
  • 最后在下方勾选需要检查的字段,即对方银行账号。

技术图片

 

 配置完成后,如果用户录入英文单引号,保存就会做如下提示:

技术图片

三、报错案例:金蝶云星空分配物料报错(论坛发现)

组织间进行物料分配时,如果物料名称包含半角引号特殊字符,也会导致报错,具体如下(实测最新版本已经修复了此问题):

技术图片

如果金蝶云星空其他地方有遇到类似问题,均可参照上一个案例,在前置单据保存时进行校验与提示来避免。

四、报错案例:用友U8合同执行单保存报错(个人实践)

如果合同分录行含有特殊字符,会导致下推合同执行单时,保存提示“语法错误或违反访问规则”,例如下图:

技术图片

下推后会提示语法错误或违反访问规则:

技术图片

对于用友U8来说,这个问题的解决方式比较麻烦,会陷入死循环,要修改去掉这个字符,就必须做合同变更单。

然而合同变更单保存的时候,也会以同样的方式报错,最终只能直接后台数据库修改,这算是产品的一个缺陷。

五、总结

其实这个也不算什么大的问题,只是刚好前两天处理一个项目遇到,就进行了一些探索,可能有如下几个方面的帮助:

实施人员角度:遇到类似错误可以先看是否有字段录入了半角引号,可能可以快速定位到问题,如果是金蝶云星空,为了彻底避免,可以参照上面的方法设置保存校验规则,其他产品只能对用于进行引导或者提报总部看能否修改。

开发人员角度:对于字符串相关的SQL语句,先进行转义处理或者替换处理,具体实现方法多种多样,可有效提前避免相关问题发生的可能性。

以上是关于求助sql数据库字段特殊字符问题的主要内容,如果未能解决你的问题,请参考以下文章

sql中如何判断字符串中含有特殊字符

怎么将带特殊字符的字符串存入sqlserver的某个字段

如何向SQL中插入含@、#等特殊字符的字符串

oracle字段中含特殊字符

如何用sql向数据库中插入包含特殊字符的字

数据库中存放特殊字符问题