Я регулярно загружаю исходный файл CSV с кодировкой cp1250, поэтому меняю кодировку на utf8mb4 с помощью PHP-скрипта ниже, потому что я в MySQL (InnoDB) установлено utf8mb4_unicode_ci.
Файл CSV содержит специальные символы в двух именах столбцов. В частности, «вариант:Детская Великость» и «вариант:Множстви», и я считаю, что проблема в этом.
Значения не совпадают. вставляются в эти два столбца. Любые другие столбцы подходят.
Я не могу повлиять на такое наименование столбцов, поскольку файл CSV обновляется автоматически.
Может ли кто-нибудь посоветовать мне, как обеспечить эти данные также вставляются в эти «специальные» столбцы? Столбцы должны содержать цифры.
УСТАНОВИТЬ КОДИРОВАНИЕ
Код: Выделить всё
// Set the character encoding to utf8mb4
if (!$mysqli->set_charset('utf8mb4')) {
die("Error setting character encoding: " . $mysqli->error);
}
// Load CSV
$data = [];
while (($row = fgetcsv($handle, 1000, ";")) !== false) {
$record = [];
foreach ($columns as $index => $column) {
// Windows-1250 -> UTF-8
$cellValue = isset($row[$index]) ? trim(iconv("Windows-1250", "UTF-8//IGNORE", $row[$index])) : null;
$record[$column] = $cellValue;
}
$record["importID"] = $importID;
$data[] = $record;
}
Код: Выделить всё
// SQL query to insert data into table 'products'
$stmt = $mysqli->prepare("
INSERT INTO products (
code,
pairCode,
.......
`variant:Dětská Velikost`,
`variant:Množství`
)
VALUES ...
");
Код: Выделить всё
foreach ($data as $record) {
// Empty cells = NULL
foreach ($record as $key => $value) {
$record[$key] = $value === "" ? NULL : $value;
}
$stmt->bind_param(
"sisssssssssssssssssssssssssii",
$record["code"],
$record["pairCode"],
.....
$record["variant:Dětská velikost"],
$record["variant:Množství"]
);
if (!$stmt->execute()) {
echo "Error: " . $stmt->error . "
";
}
}
Код: Выделить всё
// Rename columns
$columnMap = [
"variant:Dětská velikost" => "DetskaVelikost",
"variant:Množství" => "Mnozstvi",
];
$columns = array_map(function($column) use ($columnMap) {
return isset($columnMap[$column]) ? $columnMap[$column] : $column;
}, $columns);
Значения в столбцах code, pairCode и т. д. подходят, но variant:Dětská velikost и variant:Množství имеют значения NULL.
Поле
Тип
код
varchar(100)
pairCode
int(11)
...
. ..
вариант: Детская великая
int(11)
вариант:Множество
int(11)
**Я пробовал**
- сменить кодировку базы данных на cp1250
- сопоставление столбцов
- ChatGPT
Подробнее здесь: https://stackoverflow.com/questions/792 ... l-database
Мобильная версия