我编写了以下sql过程来将数据从xml加载到MYSQL表。
CREATE PROCEDURE pbadge (path varchar(255), node varchar(1000))
BEGIN
declare xml_content text;
declare v_row_index int unsigned default 0;
declare v_row_count int unsigned;
declare v_xpath_row varchar(50000);
START TRANSACTION;
SAVEPOINT sp_order;
set xml_content = load_file(path);
-- calculate the number of row elements.
set v_row_count = extractValue(xml_content, concat('count(', node, ')'));
-- loop through all the row elements
while v_row_index < v_row_count do
set v_row_index = v_row_index + 1;
set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
insert into badges values (
extractValue(xml_content, concat(v_xpath_row, '[1]')),
extractValue(xml_content, concat(v_xpath_row, '[2]')),
extractValue(xml_content, concat(v_xpath_row, '[3]')),
extractValue(xml_content, concat(v_xpath_row, '[4]'))
);
end while;
COMMIT;
我的xml如下所示,
<?xml version="1.0" encoding="utf-8"?>
<badges>
<row Id="1" UserId="2" Name="Autobiographer" Date="2010-08-05T19:11:16.743" />
<row Id="2" UserId="11" Name="Autobiographer" Date="2010-08-05T19:36:16.583" />
<row Id="3" UserId="17" Name="Autobiographer" Date="2010-08-05T19:46:16.673" />
<row Id="4" UserId="25" Name="Autobiographer" Date="2010-08-05T19:51:16.787" />
<row Id="5" UserId="36" Name="Autobiographer" Date="2010-08-05T20:16:16.817" />
<row Id="6" UserId="44" Name="Autobiographer" Date="2010-08-05T20:21:16.947" />
<row Id="7" UserId="48" Name="Autobiographer" Date="2010-08-05T20:41:16.923" />
<row Id="8" UserId="58" Name="Autobiographer" Date="2010-08-05T21:01:16.963" />
<row Id="9" UserId="6" Name="Autobiographer" Date="2010-08-05T21:46:17.117" />
<row Id="10" UserId="6" Name="Student" Date="2010-08-05T21:56:20.137" />
..
..
..
..
<row Id="1000" UserId="647" Name="Student" Date="2010-08-05T21:56:20.137" />
我在mysql命令窗口中使用了以下命令,
call pbadge ('/home/naveen/Desktop/Badges.xml', '/badges/row');
它可以正常工作852行。
当我将xml行数增加到852以上时,不会将任何内容导入到表中,并且消息显示如下,
mysql> call pbadge ('/home/naveen/Desktop/Badges.xml', '/badges/row');
Query OK, 0 rows affected, 1 warning (0.00 sec)
任何人都可以帮我解决这个问题。
由于
答案 0 :(得分:0)
&#34;每个表(无论存储引擎如何)的最大行大小为 65,535字节。存储引擎可能会对此施加其他限制 限制,减少有效最大行大小... BLOB和TEXT 列内容与行的其余部分分开存储。 [Source]&#34;
这并不意味着TEXT数据类型可以存储没有限制的任何内容[source]:
TEXT
数据类型的最大长度为 65,535 (2 16
- 1)字节(约64KB)。MEDIUMTEXT
数据类型的最大长度为 16,777,215 (2 24
- 1)字节(约16MB)LONGTEXT
数据类型的最大长度为 4,294,967,295 (2 32
- 1)字节(约4GB)如果值包含多字节字符,则有效最大长度更小。
&#34;它可以正常工作852行... xml行数超过852没有任何东西会导入到表格中#34;
这是因为其他行从未存储在xml_content
TEXT值中,因为Badges.xml
中的字符数超过了65,535字节的限制(大小> 64 KB)。
如果您的XML文件内容小于16MB(或 LONGTEXT 更大),解决方法是将xml_content
的数据类型从TEXT
更改为MEDIUMTEXT
内容小于4GB)。将代码中的声明更改为:
declare xml_content mediumtext;