Промяната на кодировката и колацията на всички таблици и колони в MySQL база данни може да бъде важна стъпка при миграция на данни, оптимизация на производителността или поддръжка на специфични езикови изисквания. В тази статия ще ви покажем как да извършите тази промяна с помощта на PHP скрипт.
Преди да започнем
Преди да пристъпим към изпълнението на PHP скрипта, е важно да направите резервно копие на базата данни. Промените в колацията могат да имат значителни ефекти върху вашите данни и заявки.
Стъпка по стъпка ръководство
- Конфигурация на базата данни: Настройте вашите база данни, хост, потребителско име и парола.
- Създаване на връзка с базата данни: Използвайте PDO (PHP Data Objects) за създаване на връзка с базата данни.
- Извличане на всички таблици: Използвайте SQL заявката
SHOW TABLES
, за да получите списък с всички таблици в базата данни. - Промяна на колацията на таблиците: За всяка таблица изпълнете SQL заявка
ALTER TABLE
, за да промените колацията на таблицата. - Извличане на всички колони: Използвайте SQL заявката
SHOW FULL COLUMNS FROM
, за да получите информация за всички колони в таблиците. - Промяна на колацията на колоните: За всяка текстова колона (като
CHAR
,VARCHAR
,TEXT
) изпълнете SQL заявкаALTER TABLE CHANGE
, за да промените колацията на колоната.
Примерен PHP скрипт
<?php // Database configuration $host = $_ENV['DB_HOST']; $db = $_ENV['DB_DATABASE']; $user = $_ENV['DB_USERNAME']; $pass = $_ENV['DB_PASSWORD']; $newCollation = 'utf8mb4_unicode_ci'; // Set the desired collation try { // Create a new PDO instance $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Get all tables in the database $tables = $pdo->query('SHOW TABLES')->fetchAll(PDO::FETCH_COLUMN); foreach ($tables as $table) { // Change table collation $pdo->exec("ALTER TABLE `$table` CONVERT TO CHARACTER SET utf8mb4 COLLATE $newCollation"); echo "Collation changed successfully for the table $table.\n"; // Get all columns in the table $columns = $pdo->query("SHOW FULL COLUMNS FROM `$table`")->fetchAll(PDO::FETCH_ASSOC); foreach ($columns as $column) { $columnName = $column['Field']; $columnType = $column['Type']; $nullable = ('YES' === $column['Null']) ? 'NULL' : 'NOT NULL'; $default = (null !== $column['Default']) ? 'DEFAULT '.$pdo->quote($column['Default']) : ''; $extra = $column['Extra']; // Change column collation if it's a text-like column type if (false !== strpos($columnType, 'char') || false !== strpos($columnType, 'text')) { $pdo->exec("ALTER TABLE `$table` CHANGE `$columnName` `$columnName` $columnType COLLATE $newCollation $nullable $default $extra"); echo "Collation changed successfully for the column $columnName in the table $table.\n"; } } } echo 'Collation changed successfully for all tables and columns.'; } catch (PDOException $e) { echo 'Error: '.$e->getMessage(); }
Важни бележки
- Скриптът се фокусира върху текстовите колони (като
CHAR
,VARCHAR
,TEXT
) за промяна на колацията. - Уверете се, че вашата база данни поддържа целевата колация и кодировка.
- Тествайте този скрипт в безопасна среда (напр. в тестова среда) преди да го приложите в продукция и винаги имайте резервно копие.