MySQL: LOAD DATA LOCAL INFILE добавляет дополнительный символ '\r'
У меня есть такая таблица:
CREATE TABLE `tblinquiries` (
`UID` varchar(50) DEFAULT NULL,
`ReviewDate` date NOT NULL,
`InquiryId` varchar(50) DEFAULT NULL,
`AuditStatus` varchar(50) DEFAULT NULL,
PRIMARY KEY (`InquiryId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
У меня есть CSV-файл с данными:
UID,ReviewDate,InquiryId,AuditStatus
UID1,2018-07-06,109814969,Check
UID2,2018-07-06,109866072,Check
UID3,2018-07-06,109911408,Check
UID4,2018-07-06,109798278,Check
Я использую приведенную ниже команду для загрузки данных:
$location = '../uploads/';
$name = $_FILES["file"]["name"];
$filePath = $location.$name;
$table = 'tblinquiries';
LOAD DATA LOCAL INFILE "'.$filePath.'"
INTO TABLE '.$table.'
FIELDS TERMINATED by \',\' OPTIONALLY ENCLOSED BY \'"\'
LINES TERMINATED BY \'\n\'
IGNORE 1 LINES
Он загружает данные, но добавляет дополнительный символ "\r" во второй строке. Я экспортировал данные и получил, как показано ниже:
('UID4', '2018-07-06', '109798278', 'Check'),
('UID1', '2018-07-06', '109814969', 'Check\r'),
('UID2', '2018-07-06', '109866072', 'Check\r'),
('UID3', '2018-07-06', '109911408', 'Check\r');
После запуска:
SELECT AuditStatus, LENGTH(AuditStatus) FROM `tblinquiries`
получил:
AuditStatus LENGTH(AuditStatus)
Check 5
Check 6
Check 6
Check 6
Как я могу решить это?
2 ответа
Решение
Как предложил @Sloan, я изменил терминаторы строки, и это решило проблему. Вот окончательный код.
LOAD DATA LOCAL INFILE "'.$filePath.'"
INTO TABLE '.$table.'
FIELDS TERMINATED by \',\' OPTIONALLY ENCLOSED BY \'"\'
LINES TERMINATED BY \'\r\n\'
IGNORE 1 LINES
Я бы предположил, что ваши исходные данные имеют те \r
управляющие символы, потому что LOAD DATA
обычно не добавляет данные в исходный файл (если вы не скажете это сделать, что, по-видимому, не так). Мы можем попробовать запустить RTRIM
на AuditStatus
колонка:
LOAD DATA LOCAL INFILE "'.$filePath.'"
INTO TABLE '.$table.'
FIELDS TERMINATED by \',\' OPTIONALLY ENCLOSED BY \'"\'
LINES TERMINATED BY \'\n\'
IGNORE 1 LINES
(UID, ReviewDate, InquiryId, @AuditStatus)
SET AuditStatus = RTRIM(@AuditStatus);