All Your Bugs Are Belong To Ass

MySQLに放り込んだXMLのネストが深すぎるとつらいという話

MySQLにXMLを放り込んでそこからextractvalue()関数を使ってタイトルをとってくる、みたいなことをしてたんだけど、どうも時折タイトルがNULLでかえってくることがあって、調べてみた。

傾向としては、1レコードあたりのXMLデータがでかい時に発生している雰囲気だったので、サイズのせいかなー、等とぼやぼや考えながら SHOW WARNINGS; を発行。

すると、以下のようなエラーが並んでいた。

mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------+
| Level   | Code | Message                                                           |
+---------+------+-------------------------------------------------------------------+
| Warning | 1525 | Incorrect XML value: 'parse error at line 85 pos 36: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 56 pos 31: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 85 pos 36: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 62 pos 31: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 85 pos 36: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 85 pos 36: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 90 pos 50: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 85 pos 36: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 65 pos 31: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 85 pos 36: To deep XML' |
| Warning | 1525 | Incorrect XML value: 'parse error at line 65 pos 31: To deep XML' |
+---------+------+-------------------------------------------------------------------+
11 rows in set (0.00 sec)

'To deep XML'... XMLが深すぎるとな?

・・・とりあえずもう少し調べてみると、http://forums.mysql.com/read.php?10,419682,419747#msg-419747に辿り着いた。

簡単に言うと、mysqlのextractvalue()関数ではXMLデータの要素は60ノードまでしかパースできないらしく、それ以上になるとXMLとして扱ってくれない。結果的にNULLを返す、ということになっていた模様。

なかなかハマりどころではありますな。

Created at
by
ytnobody
Last modified at
2013-09-22 14:21
by
ytnobody