数据库现在是latin1_general_ci,我想将排序规则更改为utf8mb4_general_ci。
在PhpMyAdmin中是否有任何设置来更改数据库,表,列的排序规则?而不是一个一个地改变?
数据库现在是latin1_general_ci,我想将排序规则更改为utf8mb4_general_ci。
在PhpMyAdmin中是否有任何设置来更改数据库,表,列的排序规则?而不是一个一个地改变?
当前回答
如果你运行phpMyAdmin >>选择数据库>>选择表>>到“操作”选项卡>>在“表选项”部分>>,你可以选择排序从下拉列表>>,一旦你按{go}在屏幕的顶部,你会看到一条消息:
您的SQL查询已成功执行
还有一个脚本
ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
但是它不会改变现有列的排序规则。 为此,您可以使用这个脚本(这个脚本也来自phpMyAdmin)
ALTER TABLE `tableName` CHANGE `Name` `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
其他回答
如果你想更新架构的默认字符集:
ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
快速方法-导出到SQL文件,使用搜索和替换来更改您需要更改的文本。创建新数据库,导入数据,然后将旧数据库和新数据库重命名为旧名称。
注意,在改变数据库的字符集/表/列,实际上你可能需要将现有的数据(例如,如果你看到类似“U…Ø·U”ˆØ¨ØªUˆØ±UŠØ¯Ø¬U”)是这样的:
update country set name = convert(cast(convert(name using latin1) as binary) using utf8), cn_flag = convert(cast(convert(cn_flag using latin1) as binary) using utf8), and so on..
对于转换数据库、表和字段,我建议从这个线程中得到这个答案,它会生成一组大的查询,你只需要在粘贴时复制,在这里我还找不到一个自动的解决方案。 还要注意的是,如果你将同一个字段转换两次,你将得到不可恢复的问号:"?? "。如果在转换字段/表之前转换数据,也会得到这个问号。
我刚刚编写了一个bash脚本来查找给定数据库中的所有表并隐藏它们(及其列)。
脚本下载地址:https://github.com/Juddling/mysql-charset
我不得不在一个有很多基的集群中更改所有数据库、表和列的排序规则。
我使用了一个运行在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);
}
}
}