博文記錄
MySQL 2021-01-13 14:25:11 14 0

在此之前,可能因为不同人协作时,或者历史原因导致的,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.新建或重建库,设置库的编码。

此时导入数据库,所有的表、字段因为没有特殊设置,会自动跟随库的编码,自此统一起来。

 

 

 

 

發表評論
StudioEIM - 冒险者讲习所
0:00