133 lines
4.3 KiB
PHP
133 lines
4.3 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Исправление всех таблиц с utf8mb3_bin на utf8mb4_general_ci
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
$dbHost = '192.168.128.3';
|
|||
|
|
$dbUser = 'nextcloud';
|
|||
|
|
$dbPass = 'nextcloud_password';
|
|||
|
|
$dbName = 'nextcloud';
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$pdo = new PDO(
|
|||
|
|
"mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4",
|
|||
|
|
$dbUser,
|
|||
|
|
$dbPass,
|
|||
|
|
[PDO::ATTR_ERRMODE => 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);
|
|||
|
|
}
|
|||
|
|
|