在此之前,可能因为不同人协作时,或者历史原因导致的,MySQL 数据库中库、表、字段都产生了不同的编码格式,可能存在同一份表很多字段编码都不一样。
如非特殊需要,这里需要将其转换编码统一为一个,方便管理,也能避免转码等应用时产生的问题。
1. 首先将数据库以SQL形式导出为文件
2. 清除SQL文件中所有关于设置表、设置字段的语句。
如果只是单个文件,通过notepad++或者emeditor之类的软件打开编辑,通过正则替换掉语句中设置编码的部分就行了。
为完整复制,下方正则加了【】括号,避免遗漏结尾的部分空格。
# 替换create table 中 注释的部分
【DEFAULT CHARSET=\S+ COLLATE=\S+ 】
# 替换表结尾中间部分
【DEFAULT CHARACTER SET \S+\s+COLLATE \S+ 】
# 替换表结尾尾巴,需要替换为;
【DEFAULT CHARSET=\S+ COLLATE=[^;];+】
# 替换表结尾中间2
【DEFAULT CHARSET=\S+ COLLATE=\S+】
# 替换表结尾中间3
【DEFAULT CHARACTER SET \S+ COLLATE 】
# 替换字段中的语句
【CHARACTER SET \S+ COLLATE \S+】
# 替换多余注释
【\n--[^\r\n]*】
如果SQL文件比较多,我临时写了个PHP脚本可以批量替换;
<?php
$list = scandir(".");
foreach($list as $file){
if(preg_match('/\.sql$/is', $file)){
$raw = file_get_contents($file);
// DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci222
// DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci111
// CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci 字段中
// DEFAULT CHARACTER SET \S+ COLLATE \S+
$raw = preg_replace('/DEFAULT CHARSET=\S+ COLLATE=\S+ /is','',$raw);# create table注释
$raw = preg_replace('/DEFAULT CHARACTER SET \S+\s+COLLATE \S+ /is','',$raw); #表结尾中间
$raw = preg_replace('/DEFAULT CHARSET=\S+ COLLATE=[^;];+/is',';',$raw);# 表结尾尾巴
$raw = preg_replace('/DEFAULT CHARSET=\S+ COLLATE=\S+/is','',$raw);# 表结尾中间2
$raw = preg_replace('/DEFAULT CHARACTER SET \S+ COLLATE \S+/is','',$raw);# 表结尾中间3
$raw = preg_replace('/CHARACTER SET \S+ COLLATE \S+/is','',$raw);#字段中
$raw = preg_replace("/\n--[^\r\n]*/is","",$raw);
$raw = preg_replace("/[\r\n]+;[\r\n]+/i","",$raw);
file_put_contents($file,$raw);
unset($raw);
echo $file.PHP_EOL;
}
}
3.新建或重建库,设置库的编码。
此时导入数据库,所有的表、字段因为没有特殊设置,会自动跟随库的编码,自此统一起来。