sql >> Base de Datos >  >> RDS >> Mysql

Problemas con MySQL LOAD XML INFILE

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.