【问题标题】:mysql load xml statement produces 0 recordsmysql load xml 语句产生 0 条记录
【发布时间】:2016-08-10 15:31:59
【问题描述】:

我在 mySQL 工作台查询中使用以下语句:

LOAD XML INFILE 'ProductFile.xml' INTO TABLE myDB.products 
ROWS IDENTIFIED BY '<product>';

产生以下日志:

19:15:52 LOAD XML INFILE 'ProductFile.xml' INTO TABLE myDB.products ROWS IDENTIFIED BY '' 0 行受影响的记录:0 已删除:0 跳过:0 警告:0 0.000 秒

ProductFile.xml 包含以下格式的数据:

<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
  <product>
    <name>Thing 1</name>
    <productUrl>http://www.productsite.com/linkofsomesorttothing1</productUrl>
    <ProductId>1234567890</ProductId>
  </product>
  <product>
    <name>Thing 2</name>
    <productUrl>http://www.productsite.com/linkofsomesorttothing2</productUrl>
    <ProductId>1234567891</ProductId>
  </product>
</products>

myDB.products 如下:

CREATE TABLE IF NOT EXISTS `myDB`.`Products` (
  `ProductId` INT UNSIGNED NOT NULL,
  `name` VARCHAR(70) NOT NULL,
  `productUrl` TEXT NULL,
   PRIMARY KEY (`ProductId`),
   UNIQUE INDEX `ProductId_UNIQUE` (`ProductId` ASC)
 ) ENGINE=InnoDB COMMENT='\n';

谁能告诉我为什么它没有输出?

【问题讨论】:

  • 更新:我在开始和结束标签之间的实际数据似乎有问题(上面的数据是我替换实际数据的示例数据)。一旦我隔离了导致问题的实际数据,我将发布更新。这有点奇怪,因为那里没有任何看起来像 html 标记的东西,所以这让我无法理解为什么解析器会感到困惑......
  • 我发现一个问题,这似乎源于字符集。我想我需要在 LOAD 语句中指定对应于 ISO-8859-1 的字符集... latin1?
  • 问题确实来自字符集。我需要在 LOAD 语句中指定对应于 ISO-8859-1 的字符集,即 CHARACTER SET latin1。现在可以了!

标签: mysql xml


【解决方案1】:

我无法重现该问题。

文件/path/to/file/ProductFile.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
  <product>
    <name>Thing 1</name>
    <productUrl>http://www.productsite.com/linkofsomesorttothing1</productUrl>
    <ProductId>1234567890</ProductId>
  </product>
  <product>
    <name>Thing 2</name>
    <productUrl>http://www.productsite.com/linkofsomesorttothing2</productUrl>
    <ProductId>1234567891</ProductId>
  </product>
</products>

MySQL 命令行

mysql> DROP TABLE IF EXISTS `Products`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `Products` (
    ->   `ProductId` INT UNSIGNED NOT NULL,
    ->   `name` VARCHAR(70) NOT NULL,
    ->   `productUrl` TEXT,
    ->   PRIMARY KEY (`ProductId`),
    ->   UNIQUE KEY `ProductId_UNIQUE` (`ProductId`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='\n';
Query OK, 0 rows affected (0.01 sec)

mysql> LOAD XML INFILE '/path/to/file/ProductFile.xml'
    ->   INTO TABLE `Products`
    ->   ROWS IDENTIFIED BY '<product>';
Query OK, 2 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT
    ->   `ProductId`,
    ->   `name`,
    ->   `productUrl`
    -> FROM
    ->   `Products`;
+------------+---------+---------------------------------------------------+
| ProductId  | name    | productUrl                                        |
+------------+---------+---------------------------------------------------+
| 1234567890 | Thing 1 | http://www.productsite.com/linkofsomesorttothing1 |
| 1234567891 | Thing 2 | http://www.productsite.com/linkofsomesorttothing2 |
+------------+---------+---------------------------------------------------+
2 rows in set (0.00 sec)

【讨论】:

  • 感谢您尝试@wchiquito。我配置 sql server 的方式一定有问题,但我不知道是什么。
【解决方案2】:

问题来自字符集。我需要在 LOAD 语句中指定对应于 ISO-8859-1 的字符集,即 CHARACTER SET latin1。现在可以了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多