No pude encontrar una manera de hacer esto usando LOAD XML INFILE
conservando el contenido de CDATA. Sin embargo, lo siguiente funciona y usa el viejo LOAD DATA INFILE
junto con ExtractValue()
para lograr lo mismo:
Si tenemos su archivo de ejemplo y esta tabla:
CREATE TABLE `yahootable` (
`id` int(11) NOT NULL PRIMARY KEY,
`various` text,
`message` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;
luego, ejecutar esta declaración importará el contenido del archivo a la tabla:
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')
;
Esto funciona diciéndole a LOAD DATA INFILE que cada <row>...</row>
es una 'línea' lógica, que almacena en la variable local @tmp
. Luego pasamos esto a ExtractValue
funcione como un fragmento XML y seleccione los valores que desee utilizando las expresiones XPath apropiadas.