数据库现在是latin1_general_ci,我想将排序规则更改为utf8mb4_general_ci。
在PhpMyAdmin中是否有任何设置来更改数据库,表,列的排序规则?而不是一个一个地改变?
数据库现在是latin1_general_ci,我想将排序规则更改为utf8mb4_general_ci。
在PhpMyAdmin中是否有任何设置来更改数据库,表,列的排序规则?而不是一个一个地改变?
当前回答
我不得不在一个有很多基的集群中更改所有数据库、表和列的排序规则。
我使用了一个运行在php 8.1和mysql 8.0上的脚本
function changeCollate() {
$databases = $this->fetchQueryToArray("SHOW DATABASES LIKE 'nova_%'")->rows;
foreach ($databases as $value) {
$db = $value['Database (nova_%)'];
$this->LOG("-- banco de dados --- " . $db);
$this->exeQuery("ALTER DATABASE `$db` COLLATE utf8mb4_0900_ai_ci;");
$this->exeQuery("use $db");
$tables = $this->fetchQueryToArray("SHOW tables")->rows;
foreach ($tables as $table) {
$tb_name = $table["Tables_in_$db"];
$this->exeQuery("ALTER TABLE `$tb_name` COLLATE utf8mb4_0900_ai_ci;");
$QUERY = "ALTER TABLE `$db`.`$tb_name`\n";
$columns = $this->fetchQueryToArray("SHOW FULL COLUMNS FROM $tb_name WHERE Type LIKE 'varchar%' OR Type = 'text' OR Type like 'enum%' OR Type = 'longtext' OR Type = 'mediumtext'")->rows;
foreach ($columns as $column) {
$QUERY .= "CHANGE `{$column['Field']}` `{$column['Field']}` {$column['Type']} COLLATE 'utf8mb4_0900_ai_ci'";
$QUERY .= ($column['Null'] == 'YES') ? " NULL" : " NOT NULL";
if ($column['Default']) $QUERY .= " DEFAULT '{$column['Default']}'";
if ($column['Comment']) $QUERY .= " COMMENT '{$column['Comment']}'";
$QUERY .= ",\n";
}
if ($QUERY == "ALTER TABLE `$db`.`$tb_name`\n") continue;
$QUERY = substr($QUERY, 0, -2) . ";\n\n";
$this->exeQuery($QUERY);
}
}
}
其他回答
我的解决方案是@Dzintars和@Quassnoi Answer的组合。
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 ;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<your-database>"
AND TABLE_TYPE="BASE TABLE";
通过使用CONVERT TO,这将生成一个脚本,它将<your-database>的所有表转换为所需的编码。这也改变了每一列的编码!
你需要单独转换每个表:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
(这同样可以转换列),或者用latin1导出数据库,然后用utf8mb4导入。
我不得不在一个有很多基的集群中更改所有数据库、表和列的排序规则。
我使用了一个运行在php 8.1和mysql 8.0上的脚本
function changeCollate() {
$databases = $this->fetchQueryToArray("SHOW DATABASES LIKE 'nova_%'")->rows;
foreach ($databases as $value) {
$db = $value['Database (nova_%)'];
$this->LOG("-- banco de dados --- " . $db);
$this->exeQuery("ALTER DATABASE `$db` COLLATE utf8mb4_0900_ai_ci;");
$this->exeQuery("use $db");
$tables = $this->fetchQueryToArray("SHOW tables")->rows;
foreach ($tables as $table) {
$tb_name = $table["Tables_in_$db"];
$this->exeQuery("ALTER TABLE `$tb_name` COLLATE utf8mb4_0900_ai_ci;");
$QUERY = "ALTER TABLE `$db`.`$tb_name`\n";
$columns = $this->fetchQueryToArray("SHOW FULL COLUMNS FROM $tb_name WHERE Type LIKE 'varchar%' OR Type = 'text' OR Type like 'enum%' OR Type = 'longtext' OR Type = 'mediumtext'")->rows;
foreach ($columns as $column) {
$QUERY .= "CHANGE `{$column['Field']}` `{$column['Field']}` {$column['Type']} COLLATE 'utf8mb4_0900_ai_ci'";
$QUERY .= ($column['Null'] == 'YES') ? " NULL" : " NOT NULL";
if ($column['Default']) $QUERY .= " DEFAULT '{$column['Default']}'";
if ($column['Comment']) $QUERY .= " COMMENT '{$column['Comment']}'";
$QUERY .= ",\n";
}
if ($QUERY == "ALTER TABLE `$db`.`$tb_name`\n") continue;
$QUERY = substr($QUERY, 0, -2) . ";\n\n";
$this->exeQuery($QUERY);
}
}
}
您可以在以下级别设置默认排序规则:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1)客户端 2)服务器默认 3)数据库默认 4)表默认 5)列
下面的查询将生成ALTER查询,将所有表中所有适当列的排序规则更改为某种类型(在下面的示例中为utf8_general_ci)。
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.data_type,
'(' ,
CHARACTER_MAXIMUM_LENGTH,
')',
' CHARACTER SET utf8 COLLATE utf8_general_ci;'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'you_db_name_goes_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');