0

При импорте 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 от чего попало, но есть два но:

  1. Файл слишком большой, более 2 гб
  2. Изначально он генерируется неизвестно каким софтом, и при ближайшем обновлении таблицы из файла всё снова начнёт валиться.

Куда стоит копать, что бы избавиться от этой штуки?

задан 24 сент. 2021 в 19:51
2
  • dev.mysql.com/doc/refman/8.0/en/… если я правильно прочитал что написано, то в запросе "LOAD DATA ... CHARACTER SET utf8mb4" - нужно указывать кодировку файла, а не кодировку базы. То есть вам в запросе нужно указать кодировку cp1251. Ну, или конвертировать файл в нужный формат Commented 25 сент. 2021 в 9:24
  • @UrfinJuezz, поигравшись с разными предоставленными демо-данными, выяснил, что кодировки там всегда скачут - то cp1251, то latin1, то еще что. Прописал просто конвертацию в UTF-8 перед последующей записью Commented 25 сент. 2021 в 12:18

1 ответ 1

0

В общем, пошёл по самому простому пути:

$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 бронзовых знаков
ответ дан 24 сент. 2021 в 22:32

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.