ExtractValue mysql XML 返回空而不是 NULL

Posted

技术标签:

【中文标题】ExtractValue mysql XML 返回空而不是 NULL【英文标题】:ExtractValue mysql XML return empty instead of NULL 【发布时间】:2014-08-15 02:16:23 【问题描述】:

我试图得到一个NULL值但输出总是空的,我不知道是不是关于mysql配置,

查询;

mysql> SELECT ExtractValue('
  <?xml version="1.0" encoding="UTF-8"?>
    <lista>
      <socios>
         <inscripcion xsi:nil="true"></inscripcion>
      </socios>
    </lista>','lista/socios/inscripcion') as value;
+-------+
| value |
+-------+
|       |
+-------+
1 row in set (0.00 sec)


mysql> SELECT ExtractValue('
<?xml version="1.0" encoding="UTF-8"?>
  <lista>
    <socios>
      <inscripcion xsi:nil="true" />
    </socios>
  </lista>','lista/socios/inscripcion') as value;
+-------+
| value |
+-------+
|       |
+-------+
1 row in set (0.00 sec)

mysql> \s

mysql Ver 14.14 Distrib 5.5.37,适用于使用 readline 6.2 的 debian-linux-gnu (x86_64)

连接 ID:53 当前数据库: 当前用户:root@localhost SSL:未使用 当前寻呼机:标准输出 使用输出文件:'' 使用分隔符:; 服务器版本:5.5.37-0+wheezy1 (Debian) 协议版本:10 连接:通过 UNIX 套接字的 localhost 服务器字符集:latin1 Db 字符集:latin1 客户端字符集:utf8 康涅狄格字符集:utf8 UNIX 套接字:/var/run/mysqld/mysqld.sock 正常运行时间:2 小时 21 分 33 秒

线程:3 问题:3531 慢查询:0 打开:453 刷新表:1 打开表:135 每秒查询平均:0.415

【问题讨论】:

得到了相同的输出,我完全不明白。 我应该如何强制获取 NULL 值? 【参考方案1】:

根据MySQL XML Functions Documentation

如果没有为表达式找到匹配的文本节点(包括隐含的 /text())——无论出于何种原因,只要xpath_expr 有效,并且xml_frag 包含正确嵌套和关闭的元素——返回一个空字符串。空元素上的匹配和根本不匹配之间没有区别。这是设计使然。

但是,您可以使用以下方法确定是否确实存在匹配元素:

SELECT ExtractValue('
  <?xml version="1.0" encoding="UTF-8"?>
    <lista>
      <socios>
         <inscripcion xsi:nil="true"></inscripcion>
      </socios>
    </lista>', 'count(lista/socios/inscripcion)') as value;

输出将是:

+-------+
| value |
+-------+
| 1     |
+-------+

编辑 1

得到了相同的输出,我根本不明白。我应该如何强制获取 NULL 值?

如果返回的(修剪后的)字符串长度为零,则可以显式返回NULL

示例

SELECT if( length( trim( @v:=ExtractValue( '
  <?xml version="1.0" encoding="UTF-8"?>
    <lista>
      <socios>
         <inscripcion xsi:nil="true">  </inscripcion>
      </socios>
    </lista>', '/lista/socios/inscripcion' ) ) ) = 0, NULL, @v ) as value;

+-------+
| value |
+-------+
| NULL  |
+-------+

如果返回一个只有空格的字符串是可以接受的,你可以使用trim 删除。

【讨论】:

谢谢,它有效,但我试图以另一种方式做,根据你的回答,我有相同的输出 codeSELECT if( length( @v:=ExtractValue( '', '/lista/socios/inscripcion' ) ) = 0, NULL, @v ) 作为值;code

以上是关于ExtractValue mysql XML 返回空而不是 NULL的主要内容,如果未能解决你的问题,请参考以下文章

mysql报错注入函数

MySQL注入 | updatexml和extractvalue函数

PLSQL 的 extractValue 方法中的 XPath 不正确

十种MySQL报错注入

sql报错注入

十种MySQL报错注入