DB2 到 SQL 链接服务器 OpenQuery 非 Ascii 字符问题

Posted

技术标签:

【中文标题】DB2 到 SQL 链接服务器 OpenQuery 非 Ascii 字符问题【英文标题】:DB2 to SQL LinkedServer OpenQuery NonAscii Character Issue 【发布时间】:2019-12-07 03:52:49 【问题描述】:

所以我一直在寻找答案,我看到了一些很棒的 SQL 函数来帮助尝试从我的数据库中删除非 ascii 字符,但我想先在这里发布整个问题/过程,看看是否可能在我从 db2 到 sql 中选择的上游有一个修复。

我在做什么:从 db2 数据库中获取数据到 SQL 中

问题:非 ascii 字符导致问题

流程:非常简单。我有一个 SQL 插入语句,可以使用开放查询从 db2 链接服务器中选择一堆列

insert into [table](stuff) select (stuff) From Openquery(SSF400,'select stuff from table')

但是,在我的 SQL 数据库中,在编辑登陆表时,我得到了奇怪的尾随字符,这些字符在 sql select 语句中显示为空格,但实际上是 SQL 编辑模式下的工件:

我尝试使用我在 SO 上找到的一些函数来去除这些字符,但在这些函数之后,我剩下的是类似于以下的希腊/英语字符组合:

我认为除了使用 openquery 之外,我必须有更好的方法来进行初始插入,这样垃圾字符就不会出现。我对 SQL 非常了解,但对 DB2 了解不多……有什么建议吗?

更新:源系统中似乎确实有一两个垃圾字符。使用 iNavigator 发现的。另外,源系统使用的是 db2 v7r3m0

更新这里是 iNavigator 查询中使用的 cmets 中提到的正则表达式的屏幕截图。尽管删除了几个字符,但仍然保留了一些字符。原始列在左侧,清理后的列在右侧。

干杯, 医学博士

【问题讨论】:

您的 db2 版本和平台是什么?您是否能够使用其他工具(某些 db2 客户端或某些使用 db2 jdbc 驱动程序的工具)检查这些垃圾字符是否真的在 db2 数据库的此列中,这不是使用 openquery 功能的结果吗? 另外,源列和目标列的数据类型和字符集是什么? select stuff 本身并不是特别有用。 @Mark 从我使用 iNavigator 可以看出,as400 使用的是 v7r3m0。我在原始帖子中添加了一张图片,显示了我使用 iNavigator 在 DB2 数据库中看到的内容,似乎确实有一两个时髦的字符..我之前没有完全扩展该列以看到这一点,抱歉。 mustaccio 源系统列被标识为 CHAR(95) CCSID 37。当我在 SQL 中创建登陆表时,我使用了相同的 CHAR(95) 但 CCSID 37 似乎是 db2 特定的语法,所以那被省略了。源和目标字符集是包含字母数字和空格的产品编号(例如 PRODUCT 12345 或 ABC1234 ) 如果适合您,请尝试使用 REGEXP_REPLACE(stuff, '[^\x00-\x7F]', '') 表达式删除非 ascii 字符。 【参考方案1】:

我会尝试REGEXP_REPLACE(stuff,'[^\u0020-\u007E\u0009\u000A\u000D]+',''),它将从 7 位 ASCII 集中删除所有不是字符的内容,但也会删除除制表符、换行符和回车符之外的任何 7 位 ASCII 控制字符。它还删除了 DEL

【讨论】:

我试过这个,但是当我在 iNavigator 中运行它时,我得到了类似的时髦字符结果。

以上是关于DB2 到 SQL 链接服务器 OpenQuery 非 Ascii 字符问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL链接服务器查询-OPENQUERY的使用

使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题

SQL Server 中的 openquery 问题

sql 使用MS SQL链接服务器连接到Active Directory并使用OpenQuery进行查询

SQL: OPENQUERY 问题

SQL 使用openquery进行跨库操作