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.