При импорте CSV запросом:
`LOAD DATA LOCAL INFILE 'data.csv` INTO TABLE `base` FIELDS TERMINATER...`
Заполучил досадную ошибку: [Invalid utf8mb4 character string: '"???? ?']
То есть, какие-то неподдерживаемые кодировкой символы.
Попробовал перед запросом отправлять SET NAMES utf8mb4 - без толку.
Далее, решил явно указать в запросе:
LOAD DATA LOCAL INFILE 'data.csv` INTO TABLE `base` CHARACTER SET utf8mb4 FIELDS TERMINATER...
Всё равно. Следом уже на удачу попробовал сменить кодировки в таблице на utf8bm4 - опять без толку.
Единственное решение, которое вижу - предварительно вычищать CSV от чего попало, но есть два но:
- Файл слишком большой, более 2 гб
- Изначально он генерируется неизвестно каким софтом, и при ближайшем обновлении таблицы из файла всё снова начнёт валиться.
Куда стоит копать, что бы избавиться от этой штуки?
-
dev.mysql.com/doc/refman/8.0/en/… если я правильно прочитал что написано, то в запросе "LOAD DATA ... CHARACTER SET utf8mb4" - нужно указывать кодировку файла, а не кодировку базы. То есть вам в запросе нужно указать кодировку cp1251. Ну, или конвертировать файл в нужный форматUrfinJuezz– UrfinJuezz2021年09月25日 09:24:15 +00:00Commented 25 сент. 2021 в 9:24
-
@UrfinJuezz, поигравшись с разными предоставленными демо-данными, выяснил, что кодировки там всегда скачут - то cp1251, то latin1, то еще что. Прописал просто конвертацию в UTF-8 перед последующей записьюDeadDed– DeadDed2021年09月25日 12:18:34 +00:00Commented 25 сент. 2021 в 12:18
1 ответ 1
В общем, пошёл по самому простому пути:
$file = fopen($csvFile,'r');
$out = fopen($output,'w+');
while(!feof($file)){
$str = fgets($file, 4896);
$str = mb_convert_encoding($str, 'UTF-8', 'windows-1251');
fwrite($out,$str);
}
И спокойно записываю это в БД. Долго, нудно, но пока других вариантов не нашёл.
0xdb
52k215 золотых знаков76 серебряных знаков269 бронзовых знаков
Начните задавать вопросы и получать на них ответы
Найдите ответ на свой вопрос, задав его.
Задать вопросlang-sql