批量修改mysql表、表、数据库的字符校对规则

记录一个在工作中遇到的问题,也不算是问题,为的是找一种简便的方法批量修改数据表字段的排序规则,在MySQL中叫collation,常常和编码CHARACTER一起出现的。collation有三种级别,分辨是数据库级别,数据表级别和字段级别。

1.The database level
2.The table level
3.The column level

https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database 这篇文章说得比较详细。

那天遇到的问题是这样子的,
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation ‘=‘,主要是因为迁移数据库时候没有把collation规则及时修改过来。

网上搜到的解决办法,都提到了修改数据表级别collation排序规则。但是我遇到的场景是数据表级别已经是utf8_unicode_ci,而字段级别是utf8_general_ci,(这里我们关心的字段类型是varchar)。

由于需要修改的字段太多了,手工修改肯定是费时费力的。自然也想到了用脚本的方式批量修改,但是发现这种通过查找MySQL信息表、过滤、拼接生成批量修改的语句太好用了,而且还能做到针对varchar类型。

SELECT CONCAT(‘ALTER TABLE `‘, table_name, ‘` MODIFY `‘, column_name, ‘` ‘, DATA_TYPE, ‘(‘, CHARACTER_MAXIMUM_LENGTH, ‘) CHARACTER SET UTF8 COLLATE utf8_unicode_ci‘, (CASE WHEN IS_NULLABLE = ‘NO‘ THEN ‘ NOT NULL‘ ELSE ‘‘ END), ‘;‘)FROM information_schema.COLUMNSWHERE TABLE_SCHEMA = ‘database‘AND DATA_TYPE = ‘varchar‘AND(
    CHARACTER_SET_NAME != ‘utf8‘
    OR
    COLLATION_NAME != ‘utf8_unicode_ci‘);

database需要改成实际数据库名字。需要注意的是,如果要修改的字段存在外键关系,那就要小心处理,删除外键,修改collation后再把外键关系加回来。

摘自http://segmentfault.com/a/1190000002570642

==========================以上网络引用,下面内容是我修改后的SQL,感谢郑同学帮忙=======================================

-- 修改数据库表校对规则SQL,执行时将表中列的校对规则一并修改。
delimiter//
drop procedure if exists `alter_table_character` //-- 若已存在则删除
create procedure `alter_table_character`() 
begin
    declare f_name varchar(100); 
    declare b int default 0;    /*是否达到记录的末尾控制变量*/
		-- 注意修改下面的数据库名称 wsm_aliyun
    declare table_name cursor for SELECT TABLE_NAME FROM information_schema.TABLES where TABLE_SCHEMA = ‘wsm_aliyun‘ and TABLE_NAME like ‘wsm_%‘ AND TABLE_COLLATION = ‘utf8_unicode_ci‘;    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
   
    OPEN table_name;
    REPEAT
    FETCH table_name INTO f_name; /*获取第一条记录*/
				SET @STMT :=CONCAT("ALTER TABLE ",f_name," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;");   
			PREPARE STMT FROM @STMT;   
    EXECUTE STMT;  
-- INSERT into TestTable(name) VALUES (f_name);
       -- ALTER TABLE f_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
    UNTIL b = 1
		END REPEAT;
    close table_name;        
end;
//
/*切换回系统默认的命令结束标志*/
delimiter ;
-- 执行存储过程
call alter_table_character();
-- 修改数据库的校对规则
set names ‘utf8‘ collate ‘utf8_general_ci‘;
-- 查询修改的结果,其实还可以用下面的语句生成相应的SQL,执行这个SQL来完成修改,当然没有上面的存储过程效率高。

-- 查看数据库的校对规则,结果全都为:utf8_general_ci,表示已修改
show variables like ‘collation_%‘;
-- 查看数据库的校对规则,没有数据表明已全部修改。
SELECT
	CONCAT(‘alter table ‘, TABLE_NAME, ‘ CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;‘) as new_sql
FROM
	INFORMATION_SCHEMA.TABLES
WHERE
	TABLE_SCHEMA = ‘wsm_aliyun‘
AND TABLE_NAME LIKE ‘wsm_%‘ -- 数据库名称
AND TABLE_COLLATION = ‘utf8_unicode_ci‘;

-- 查询列结果,没有数据表明已全部修改。
SELECT
	CONCAT(
		‘ALTER TABLE `‘,
		table_name,
		‘` MODIFY `‘,
		column_name,
		‘` ‘,
		DATA_TYPE,
		‘(‘,
		CHARACTER_MAXIMUM_LENGTH,
		‘) CHARACTER SET UTF8 COLLATE utf8_general_ci;‘
	) as new_sql
FROM
	information_schema.COLUMNS
WHERE
	TABLE_SCHEMA = ‘wsm_aliyun‘ -- 数据库名
AND TABLE_NAME LIKE ‘wsm_%‘
AND DATA_TYPE = ‘varchar‘
AND CHARACTER_SET_NAME = ‘utf8‘
AND COLLATION_NAME = ‘utf8_unicode_ci‘;
时间: 2024-10-01 04:29:08

批量修改mysql表、表、数据库的字符校对规则的相关文章

phpMyAdmin批量修改Mysql数据表前缀的方法

多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分.而如何批量修改已有数据库的前缀名 呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍的是相对简单的批量修改数据库中表前缀的方法,适用于修改数据库中相同前缀且数据表较多 的情况. 此例中假定修改名为“www_sdck_cn”的数据库中前缀为“phpcms_”的表,并将所有符合条件表的前缀修改为“sdck_”. 1.        用phpMyAdmin打开要修改前缀的数据库www_

php 批量修改mysql 数据表,字段 字符集编码

$sql="SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名称'"; $r=$pdo->query($sql,2); foreach($r as $v){ //if($v['TABLE_NAME']!='monxin_index_user'){continue;} 代码来源 梦行云软件 $sql="alter table `".$v['TABLE_NAME']."`

批量修改mysql数据库表前缀。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

orcad元件属性批量修改及BOM表

本文适合于没有使用CIS的情况下,提高元件属性修改的效率和BOM生成. 第一步:编号 首先给元件编好号: 如果是沿用旧工程,用这个编号.如果是创建的新工程,使用第二项,强制从头开始编号.因为编号与PCB是相对应的,如果任意改动旧工程的编号会导致PCB出错,所以添加新元件后通常都是使用自增编号:而新工程不会存在这个问题,从头开始编号正规.美观. 第二步:导出属性表格 选择导出的路径,将文件导出来. 在文件上右键,选择用EXCEL打开: 它里面有好多默认属性,这个不用管,右键插入列,将自定义的属性加

生产环境批量修改mysql引擎

生产环境中如何批量修改MySQL引擎 一般来说这样的需求并不多见,但是偶尔也会有,在这里我们推荐使用sed对备份的内容进行引擎转换的方式,当然了,不要忘记修改my.cnf使之支持并能高效的使用对于的引用. 方法1 mysql命令语句修改 创建后引擎更改,5.0版本之后 alter table lvnian engine=innodb; alter table lvnian engine=MyISAM; 其中lvnian是表名 更改实例 ##############################

MySQL批量修改相同后缀表名

执行步骤 1.用concat批量生成修改表名的语句 SELECT CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO ', substring(table_name,1,locate('_postfix',table_name)),'_new_postfix',';' ) FROM information_schema.tables Where table_name LIKE '%_postfix'; 2.将生成的语句执行一遍即可完成修改 ------

织梦批量修改栏目的保存目录和文章命名规则

批量修改栏目的保存目录 比如,想批量去掉所有栏目里的/a 核心-批量维护-数据库内容替换 Ps:以后创建栏目不想自动带/a的话,在 系统-系统基本参数-站点设置-文档HTML默认保存路径,删除/a即可 批量修改栏目的文章命名规则 比如,想批量去掉所有栏目里的文章命名规则里的 {Y}/{M}{D}/ 核心-批量维护-数据库内容替换 原文地址:https://www.cnblogs.com/dedevip/p/9902429.html

批量修改Mysql数据库表MyISAM为InnoDB

网上有这样一个方法: 1.查看当前数据引擎的命令: show engines; 2. USE `[DBNAME]`; SELECT GROUP_CONCAT(CONCAT( 'ALTER TABLE ' ,TABLE_NAME ,' ENGINE=InnoDB; ') SEPARATOR '' ) FROM information_schema.TABLES AS t WHERE TABLE_SCHEMA = '[DBNAME]' AND TABLE_TYPE = 'BASE TABLE'; 将

批量修改Mysql数据库表Innodb为MyISAN

mysql -uroot -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'jitamin2' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'"