105 lines
3.1 KiB
PHP
105 lines
3.1 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Исправление проблемы с collation в БД Nextcloud
|
|||
|
|
* Заменяет utf8mb3_general_ci на utf8mb4_general_ci
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
error_reporting(E_ALL);
|
|||
|
|
ini_set('display_errors', 1);
|
|||
|
|
|
|||
|
|
echo "=== ИСПРАВЛЕНИЕ COLLATION В БД NEXTCLOUD ===\n";
|
|||
|
|
echo str_repeat("=", 80) . "\n\n";
|
|||
|
|
|
|||
|
|
// Подключение к БД Nextcloud
|
|||
|
|
$host = '192.168.128.3';
|
|||
|
|
$user = 'nextcloud';
|
|||
|
|
$password = 'nextcloud_password';
|
|||
|
|
$database = 'nextcloud';
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$db = new mysqli($host, $user, $password, $database);
|
|||
|
|
|
|||
|
|
if ($db->connect_error) {
|
|||
|
|
throw new Exception("Ошибка подключения: " . $db->connect_error);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$db->set_charset('utf8mb4');
|
|||
|
|
|
|||
|
|
echo "✅ Подключились к БД Nextcloud\n\n";
|
|||
|
|
|
|||
|
|
// Находим таблицы с неправильной collation
|
|||
|
|
echo "🔍 Поиск таблиц с неправильной collation...\n";
|
|||
|
|
$result = $db->query("
|
|||
|
|
SELECT TABLE_NAME, TABLE_COLLATION
|
|||
|
|
FROM information_schema.TABLES
|
|||
|
|
WHERE TABLE_SCHEMA = 'nextcloud'
|
|||
|
|
AND TABLE_COLLATION LIKE '%utf8mb3%'
|
|||
|
|
");
|
|||
|
|
|
|||
|
|
$tables = [];
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
$tables[] = $row['TABLE_NAME'];
|
|||
|
|
echo " - {$row['TABLE_NAME']}: {$row['TABLE_COLLATION']}\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (empty($tables)) {
|
|||
|
|
echo "✅ Все таблицы имеют правильную collation\n";
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "\n📊 Найдено таблиц для исправления: " . count($tables) . "\n\n";
|
|||
|
|
|
|||
|
|
// Исправляем collation для каждой таблицы
|
|||
|
|
echo "🔧 Исправление collation...\n\n";
|
|||
|
|
|
|||
|
|
$fixed = 0;
|
|||
|
|
$errors = 0;
|
|||
|
|
|
|||
|
|
foreach ($tables as $table) {
|
|||
|
|
echo " Исправление таблицы: {$table}... ";
|
|||
|
|
|
|||
|
|
// Изменяем collation таблицы
|
|||
|
|
$sql = "ALTER TABLE `{$table}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci";
|
|||
|
|
|
|||
|
|
if ($db->query($sql)) {
|
|||
|
|
echo "✅\n";
|
|||
|
|
$fixed++;
|
|||
|
|
} else {
|
|||
|
|
echo "❌ Ошибка: " . $db->error . "\n";
|
|||
|
|
$errors++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "\n";
|
|||
|
|
echo str_repeat("=", 80) . "\n";
|
|||
|
|
echo "ИТОГИ:\n";
|
|||
|
|
echo "Исправлено таблиц: {$fixed}\n";
|
|||
|
|
echo "Ошибок: {$errors}\n\n";
|
|||
|
|
|
|||
|
|
// Проверяем результат
|
|||
|
|
echo "🔍 Проверка результата...\n";
|
|||
|
|
$result = $db->query("
|
|||
|
|
SELECT COUNT(*) as count
|
|||
|
|
FROM information_schema.TABLES
|
|||
|
|
WHERE TABLE_SCHEMA = 'nextcloud'
|
|||
|
|
AND TABLE_COLLATION LIKE '%utf8mb3%'
|
|||
|
|
");
|
|||
|
|
|
|||
|
|
$row = $result->fetch_assoc();
|
|||
|
|
if ($row['count'] == 0) {
|
|||
|
|
echo "✅ Все таблицы исправлены!\n";
|
|||
|
|
} else {
|
|||
|
|
echo "⚠️ Осталось таблиц с неправильной collation: {$row['count']}\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$db->close();
|
|||
|
|
|
|||
|
|
echo "\n=== ГОТОВО ===\n";
|
|||
|
|
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo "❌ Критическая ошибка: " . $e->getMessage() . "\n";
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|