我正在尝试针对DB2 v10.5数据库执行一些简单的正则表达式。该数据库包含大量记录。
以下作品:
SELECT
e.EMLNAME,
XMLCAST(XMLQUERY('fn:matches($LNAME, "^[A-Z]*$")' PASSING (e.EMLNAME) as "LNAME") as integer) as foo
FROM MYDB.EMPLOYEE e;
然而,当我尝试比较上面的正则表达式结果时,它会从运行变为失败。
失败的示例查询:
-- Fails
SELECT
e.EMLNAME
FROM MYDB.EMPLOYEE e
WHERE XMLCAST(XMLQUERY('fn:matches($LNAME, "^[A-Z]*$")' PASSING (e.EMLNAME) as "LNAME") as integer) = 1;
错误如下:
[SELECT - 0行,0.000秒] [错误代码:-20377,SQL状态: 0N002]在SQL / XML中找到了非法的XML字符“#x1A” 以字符串“O NE”开头的表达式或函数参数.. SQLCODE = -20377,SQLSTATE = 0N002,DRIVER = 4.18.60
进行一些谷歌搜索,#x1A看起来是SUBSTITUTE
字符转义(http://www.fileformat.info/info/unicode/char/1a/index.htm)。看到XMLQUERY部分工作,我尝试用XMLCAST包装它来进行比较,我在另一个堆栈溢出帖子(Regular Expressions in DB2 SQL)中找到了比较。
我有一个DBA在他的盒子上尝试查询并且它有效。他的机器是一个窗户盒,我的是Mac。我们都在使用DBVisualizer。他有一个旧版本并升级到9.5.2,它仍然适用于他。升级后,我仍然遇到同样的问题,但是有一个新的驱动程序号:
[SELECT - 0 rows,0.000 secs] [代码:-20377,SQL状态:0N002] 在SQL / XML表达式中找到非法的XML字符“#x1A” 以字符串“O NE”开头的函数参数.. SQLCODE = -20377, SQLSTATE = 0N002,DRIVER = 4.19.49
根据我的一位同事的建议,我下载并安装了IntelliJ的Data Grip。不错的工具,但是当我对姓氏字段运行查询时,它也会爆炸,出现类似的错误,这让我觉得错误消息来自DB2或java驱动程序?
[0N002] [ - 20377]在一个中发现了一个非法的XML字符“#x1A” 以字符串“O”开头的SQL / XML表达式或函数参数 NE“.. SQLCODE = -20377,SQLSTATE = 0N002,DRIVER = 4.7.85
在连接设置中,我的连接字符串类似于:
jdbc:db2://serverdns:50001/MYDB
type 4
driver: DB2 (LUW)
在数据库中定位一个不同的字段允许我运行查询而没有问题...所以看起来像一个可能的数据问题,但由于Windows可以运行它,它让我想知道它是否是一个驱动程序,或者如果我在运行查询之前需要做一些特殊的转义吗?
我需要一种开发人员友好的方式在mac上运行此查询。特别是使用db visualizer或data grip。意图是最终移植到java代码中,所以如果它是驱动程序更新,或者更改为查询,它们都可以工作,只要它在所提到的查询工具之一中工作并且可以移植到java中(带有额外的转义,等)
深入查看报告的内容,我对名字中的O
和姓名NE
的姓氏进行了查询。这导致我看到一条看起来可能与错误匹配的记录。我复制了该字段的文本并将其粘贴到一个在线表单中,看起来像一个空格就消失了。然而,当我将它粘贴到崇高时,我看到了SUB
字符持有者。
执行上述查询,但排除一条记录可以使查询正常运行。基于此,看起来mac上的查询需要知道当字段/字符串中存在SUB
等字符时如何运行。
我可以做些什么来使我的Mac上运行?
更新
我仍在寻找是否有办法去做所要求的事情。但是,由于我们还没有找到一个直接的答案,我发布了一些有助于解决这个问题的事情。请注意,我没有找到使用版本10.5执行范围的方法,因此我必须明确为x0E - x1F
范围内可能较差的每个值执行一个大小写。
识别包含错误数据的记录,如:
SELECT
e.ID, e.EMLNAME
FROM MYDB.EMPLOYEE e
WHERE
-- Last name checks.
e.EMLNAME like CONCAT(CONCAT('%', x'0E'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'0F'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'10'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'11'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'12'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'13'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'14'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'15'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'16'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'17'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'18'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'19'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'1A'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'1B'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'1C'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'1D'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'1E'), '%')
OR e.EMLNAME like CONCAT(CONCAT('%', x'1F'), '%');
删除不良字符,如:
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'0E', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'0F', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'10', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'11', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'12', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'13', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'14', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'15', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'16', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'17', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'18', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'19', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'1A', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'1B', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'1C', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'1D', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'1E', '');
UPDATE MYDB.EMPLOYEE e SET e.EMLNAME = REPLACE(e.EMLNAME, x'1F', '');
答案 0 :(得分:0)
SWAG,基于数据显示为O␚NEAL
,可能最初打算存储为字符数据O'NEAL
,或者在字符串文字符号'O''NEAL'
中显示转义撇号:
XML的编码是UTF8,但Mac希望[已配置数据库访问/连接请求¿应用程序代码页?设置]该数据在ISO-8859-1或CP819中返回。但是,存储数据可能中的字符最初是在Windows应用程序中生成的;转换或以其他方式导致标准撇号 '
0x27 ASCII 7位字符的应用程序[有效] 自动更正到’
0xE28099 UTF8,0x2019 UTF16“右单引号”[或用MS语言,智能引用]字符或进入0x92“右单引号”ASCII 8位CP1252。
因此,无论’
或’
或&rsquo
[或类似的;那些是HTML编码的例子,所以不一定是特殊字符的XML编码的例子]已经完成来表示该字符,缺少从该字符/字形到Mac上的等效字符的字符转换[具有该限制集编码方案选择]可能正确地为CP810 [{1}} 0x1A字符[虽然表示为␚
0xEFBFBD UTF8或0xFFFD UTF16]。 Win客户端当然会对要求UTF8或CP1252 [后者可能是默认值]感到满意,因为知道该字形的。但是,如果[重新]配置为要求UTF8而不是可能被要求作为CP819,Mac客户端会更高兴;即可能违约。
以下文档引用可能支持我对函数的假设,虽然不是最初存储在导致问题的行中的数据:
答案 1 :(得分:0)
如果您的数据具有不可解析的字符,请在使用前将其删除:
<?php
// get posts
$posts = get_posts(array(
'post_type' => 'event',
'posts_per_page' => -1,
'meta_key' => 'start_date',
'orderby' => 'meta_value_num',
'order' => 'DESC'
));
if( $posts ): ?>
<ul>
<?php foreach( $posts as $post ):
setup_postdata( $post )
?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?> (date: <?php the_field('start_date'); ?>)</a>
</li>
<?php endforeach; ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
或其他查询:
SELECT
e.EMLNAME,
XMLCAST(XMLQUERY('fn:matches($LNAME, "^[A-Z]*$")'
PASSING (fn:replace(e.EMLNAME, '[#x0E-#x1F]', '') as "LNAME") as integer) as foo
FROM MYDB.EMPLOYEE e