PDO::ERRMODE_EXCEPTION] ); echo "=== ИСПРАВЛЕНИЕ ВСЕХ ТАБЛИЦ С utf8mb3_bin ===\n\n"; // Находим все колонки с utf8mb3_bin $query = " SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME LIKE 'oc_%' AND COLLATION_NAME LIKE '%utf8mb3%' ORDER BY TABLE_NAME, COLUMN_NAME "; $stmt = $pdo->prepare($query); $stmt->execute([$dbName]); $columns = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($columns)) { echo "✅ Все колонки уже имеют правильную collation!\n"; exit(0); } echo "Найдено колонок с utf8mb3: " . count($columns) . "\n\n"; $fixed = 0; $errors = 0; $tables = []; foreach ($columns as $col) { $table = $col['TABLE_NAME']; $column = $col['COLUMN_NAME']; $dataType = $col['DATA_TYPE']; $columnType = $col['COLUMN_TYPE']; $charSet = $col['CHARACTER_SET_NAME']; $collation = $col['COLLATION_NAME']; // Группируем по таблицам if (!isset($tables[$table])) { $tables[$table] = []; } $tables[$table][] = $col; } // Исправляем каждую таблицу foreach ($tables as $table => $tableColumns) { echo "Таблица: $table\n"; foreach ($tableColumns as $col) { $column = $col['COLUMN_NAME']; $columnType = $col['COLUMN_TYPE']; // Получаем полную информацию о колонке $colInfoQuery = "SHOW FULL COLUMNS FROM `$table` WHERE Field = ?"; $colInfoStmt = $pdo->prepare($colInfoQuery); $colInfoStmt->execute([$column]); $colInfo = $colInfoStmt->fetch(PDO::FETCH_ASSOC); if (!$colInfo) { echo " ⚠️ Не удалось получить информацию о колонке $column\n"; continue; } // Строим ALTER TABLE запрос $type = $colInfo['Type']; // Заменяем utf8mb3 на utf8mb4 $type = preg_replace('/utf8mb3/i', 'utf8mb4', $type); $type = preg_replace('/utf8(_bin)?/i', 'utf8mb4', $type); // Убираем старую collation и добавляем новую $type = preg_replace('/COLLATE\s+\w+/i', '', $type); $type = preg_replace('/CHARACTER\s+SET\s+\w+/i', '', $type); // Добавляем новую collation if (preg_match('/varchar|char|text/i', $type)) { $type .= ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci'; } $null = $colInfo['Null'] === 'YES' ? 'NULL' : 'NOT NULL'; $default = ''; if ($colInfo['Default'] !== null) { $default = "DEFAULT '" . addslashes($colInfo['Default']) . "'"; } $extra = $colInfo['Extra'] ?: ''; $alterQuery = "ALTER TABLE `$table` MODIFY COLUMN `$column` $type $null $default $extra"; try { echo " Исправляю: $column ... "; $pdo->exec($alterQuery); echo "✅\n"; $fixed++; } catch (PDOException $e) { echo "❌ Ошибка: " . $e->getMessage() . "\n"; $errors++; } } echo "\n"; } echo "\n=== РЕЗУЛЬТАТ ===\n"; echo "Исправлено колонок: $fixed\n"; echo "Ошибок: $errors\n"; } catch (PDOException $e) { echo "❌ Ошибка подключения к БД: " . $e->getMessage() . "\n"; exit(1); }