Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Problemas com MySQL LOAD XML INFILE


Não consegui encontrar uma maneira de fazer isso usando LOAD XML INFILE preservando o conteúdo CDATA. No entanto, o seguinte funciona e usa o bom e velho LOAD DATA INFILE junto com ExtractValue() para realizar a mesma coisa:

Se tivermos seu arquivo de exemplo e esta tabela:
CREATE TABLE `yahootable` (
  `id` int(11) NOT NULL PRIMARY KEY,
  `various` text,
  `message` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;

em seguida, executar esta instrução importará o conteúdo do arquivo para a tabela:
LOAD DATA INFILE 
    '/tmp/yahootable.xml'
INTO TABLE 
    yahootable
CHARACTER SET 'utf8'
LINES STARTING BY '<row>' TERMINATED BY '</row>'
(@tmp)
SET
  id      = ExtractValue(@tmp, '//id'),
  various = ExtractValue(@tmp, '//various'),
  message = ExtractValue(@tmp, '//message')
;

Isso funciona dizendo a LOAD DATA INFILE que cada <row>...</row> é uma 'linha' lógica, que armazena na variável local @tmp . Em seguida, passamos isso para o ExtractValue funcione como um fragmento XML e selecione os valores que desejamos usando as expressões XPath apropriadas.