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を返す、ということになっていた模様。
なかなかハマりどころではありますな。