Не преувеличивайте возможности LOAD DATA

Задача
Вам кажется, что LOAD DATA умнее, чем есть на самом деле.

Решение
Не думайте, что LOAD DATA знает все о формате вашего файла данных. И удостоверьтесь в том, что сами знаете, каков этот формат. Если файл передавал-ся с одной машины на другую, его содержимое могло слегка измениться, а вы могли этого не заметить.

Обсуждение
Часто разочарование от использования LOAD DATA наступает из-за того, что люди слишком преувеличивают возможности MySQL. Предложение LOAD DATA делает ряд допущений о структуре входного файла, которые заключаются в установленных по умолчанию разделителях строк и полей, кавычках и экранирующих символах. Если вводимые данные не соответствуют этим допущениям, вы должны сообщить об этом MySQL.

Если у вас есть сомнения, проверьте содержимое файла с помощью шестнадцатеричного дампа или какой-либо утилиты, явно отображающей такие пробельные символы, как табуляция, возврат каретки и конец строки. В UNIX можно воспользоваться программой od, способной отображать содержимое файла в различных форматах. При отсутствии od и других подобных утилит, загляните в каталог transfer дистрибутива recipes, в котором вы найдете программы вывода шестнадцатеричного дампа на Perl и Python (hexdump.pl и hexdump.py), а также пару программ, визуализирующих все символы файла (see.pl и see.py).


Они могут пригодиться для выяснения того, какие символы в действительности содержит ваш файл. Вас может удивить, насколько содержимое файла иногда отличается от ваших ожиданий. В действительности, это довольно часто случается при передаче файла с одной машины на другую:

• При передаче файлов по FTP в текстовом (не двоичном) режиме между разными операционными системами обычно выполняется преобразование разделителей строк в формат, принятый принимающей стороной.

Предположим, у вас есть файл, в котором поля и записи разделены символами TAB и LF соответственно, и который прекрасно загружается под UNIX предложением LOAD DATA с установками по умолчанию. Если вы передадите этот файл по FTP в текстовом режиме на Windows-машину, то вполне возможно, что символы LF будут заменены парами CRLF. На этой
машине файл не сможет загрузиться корректно тем же самым предложением LOAD DATA, так как его содержимое претерпело изменения. Может ли MySQL знать об этом? Нет. Так что это ваша обязанность – добавить инструкцию LINES TERMINATED BY '\r\n' в команду загрузки. К такому результату может привести передача файлов между любыми двумя системами с разными соглашениями о разделителе строк.


К примеру, в файлах Macintosh, содержащих символ возврата каретки CR, после их передачи в UNIX могут появиться символы конца строки LF. Вы должны либо отражать такие изменения в инструкции LINES TERMINATED BY, либо передавать файлы в двоичном режиме во избежание нежелательных преобразований.

• Файлы данных, вставленные в тело электронного письма, часто подвергаются изменениям. Почтовые программы могут свернуть (разбить на части) длинные строки или заменить разделители строк. По электронной почте файлы данных лучше отправлять присоединенными к письму, а не в теле письма.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Диагностическая утилита для LOAD DATA
Извлечение и перестановка столбцов файлов данных
Импорт XML в MySQL
Импорт с помощью LOAD DATA и утилиты mysqlimport
Импорт файлов в формате CSV

Вернуться в раздел: MySQL / 10. Импорт и экспорт данных