Не можах да намеря начин да направя това с помощта на LOAD XML INFILE
като същевременно запазва съдържанието на CDATA. Въпреки това, следното работи и използва добрия стар LOAD DATA INFILE
заедно с ExtractValue()
за да постигнете същото:
Ако имаме вашия примерен файл и тази таблица:
CREATE TABLE `yahootable` (
`id` int(11) NOT NULL PRIMARY KEY,
`various` text,
`message` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;
след това изпълнението на този оператор ще импортира съдържанието на файла в таблицата:
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')
;
Това работи, като казва на LOAD DATA INFILE, че всеки <row>...</row>
е логическа „линия“, която съхранява в локалната променлива @tmp
. След това предаваме това на ExtractValue
функционират като XML фрагмент и избираме стойностите от него, които искаме, като използваме подходящите XPath изрази.