使用mysql程序导入Xml到MYSQL

时间:2014-10-26 05:57:30

标签: mysql xml xml-parsing mysql-workbench

我编写了以下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)

任何人都可以帮我解决这个问题。

由于

1 个答案:

答案 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;