mysql批量更改编码,批量修改外等

今天在搞数据库的时候犯了一个错误,就是同步线上库的时候发生了很多找不到字符串编码的错误,于是有了今天的文章

首先获取更改字段的语句

在查询的时候并没有找到如何批量修改,所以我的想法是通过sql语句生成修改的语句,核心就是CONCAT()函数和information_schema库。

concat()函数用于字符串的拼接,用该函数拼接处更改字段的sql 语句
information_schema库是用于存放所有库,所有表,所有字段的信息的

一条正常的数据库修改类型编码的语句

ALTER TABLE `表名` MODIFY `字段名` CHAR(32) CHARACTER SET UTF8mb4 COLLATE utf8mb4_general_ci;

再来一个他爸爸(即生产出这条sql的sql语句)

实现功能是查询该表中所有编码排序为utf8mb4_0900_as_cs类型的字段,然后改为utf8mb4编码排序规则为utf8mb4_general_ci
修改所有被*包围的地方

SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, ') CHARACTER SET **UTF8mb4** COLLATE **utf8mb4_general_ci**',  ';')
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA='**表名**' AND (DATA_TYPE='varchar' OR DATA_TYPE='char' OR DATA_TYPE='text'OR DATA_TYPE='longtext') AND COLLATION_NAME='**utf8mb4_0900_as_cs**';

如果没有外键的话基本这样就可以了

有外键的情况,需要先删除外键,然后更改编码,最后还原外键

注意: 外键不能修改,所有修改方式也是删除后重新插入

1、 首先按照上面的内容先将sql执行出来,并保存起来
2、 要获取一下所有外键的插入信息**(千万要先获取插入外键的sql,先删除的话就改跑路了)**
一条正常的插入外键的sql

ALTER TABLE 表名 ADD CONSTRAINT FK_外键名 FOREIGN KEY(本表中外键id) REFERENCES 关联表表名(关联字段) ON DELETE RESTRICT ON UPDATE CASCADE;

再来一个他爸爸
SELECT CONCAT("alter table " ,table_name, " add constraint " ,constraint_name," foreign key(",COLUMN_NAME ,") references ",REFERENCED_TABLE_NAME,"(",REFERENCED_COLUMN_NAME,") on delete restrict on update CASCADE;")
FROM information_schema.`KEY_COLUMN_USAGE` 
WHERE TABLE_SCHEMA="*表名*" AND CONSTRAINT_NAME!="PRIMARY"

然后把生产出来的sql保存起来

3、删除掉原有外键

同样的流程,我挨个贴出来

一条正常的插入外键的sql

ALTER TABLE 表名 DROP FOREIGN KEY FK_外键名;

再来一个他爸爸
SELECT CONCAT("alter table " ,table_name, " DROP FOREIGN KEY " ,constraint_name,";")
FROM information_schema.`KEY_COLUMN_USAGE` 
WHERE TABLE_SCHEMA="**表名**" AND CONSTRAINT_NAME!="PRIMARY"

这一步生产的结果,可以直接运行

4、执行第一步中保存的sql:修改编码
5、执行第二步中保存的sql:重新生成外键
6、还有表的编码更改
在这里插入代码片

sqlyog可以直接用文本方式查看结果,复制“------------”线以下的结果即可
在这里插入图片描述
贴一个information_schema库下个表的作用并将一些常用的表加了重点
information_schema数据库表说明:
引用原文

  1. SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
  2. TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
  3. COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
  4. STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
  5. USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
  6. SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
  7. TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
  8. COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
  9. CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
  10. COLLATIONS表:提供了关于各字符集的对照信息。
  11. COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
  12. TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
  13. KEY_COLUMN_USAGE表:描述了具有约束的键列。包含了主外键信息
  14. ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
  15. VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
  16. TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
### 回答1: 如果你想在 MySQL批量修改表中字段的编码格式,你可以使用以下步骤: 1. 使用 `SHOW FULL COLUMNS FROM table_name` 命令查看表中字段的编码格式。 2. 使用 `ALTER TABLE table_name MODIFY column_name VARCHAR(length) CHARACTER SET charset_name COLLATE collation_name;` 命令修改某个字段的编码格式。 3. 重复步骤 2,修改表中所有需要修改的字段的编码格式。 例如,如果你想将表 `customers` 中的 `name` 字段的编码格式修改为 `utf8mb4`,你可以使用以下命令: ``` ALTER TABLE customers MODIFY name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 希望这能帮到你! ### 回答2: 批量修改表中字段的编码格式需要以下步骤: 1. 连接数据库:使用数据库的连接工具,如MySQL Workbench或Navicat等,连接到需要修改编码格式的数据库。 2. 备份数据表:在进行任何修改之前,务必先备份需要修改的数据表,以防止数据丢失。可以通过导出数据表为.sql文件的方式进行备份。 3. 查看当前编码格式:通过执行"SHOW CREATE TABLE 表名"的SQL语句,查看当前需要修改的字段的编码格式。例如,如果需要修改表名为"students"的字段编码格式,可以执行"SHOW CREATE TABLE students"。 4. 修改字段编码格式:根据查看到的字段编码格式,可以使用"ALTER TABLE 表名 MODIFY COLUMN 字段名 新编码格式"的SQL语句来进行修改。例如,如果需要将字段名为"name"的编码格式修改为UTF-8,可以执行"ALTER TABLE students MODIFY COLUMN name VARCHAR(100) CHARACTER SET utf8"。 5. 批量修改所有需要修改的字段:根据需要修改的字段数量,逐个执行步骤4中的SQL语句,将所有需要修改的字段的编码格式进行修改。 6. 验证修改结果:可以执行"SHOW CREATE TABLE 表名"等SQL语句,再次查看修改后的字段编码格式是否已经正确修改。 7. 测试数据:在完成字段编码格式修改后,可以随机选择部分数据进行测试,确保数据在修改编码格式后能够正确显示和存储。 8. 数据恢复:如果在修改过程中发生了错误或者数据不符合预期,可以使用之前备份的.sql文件进行数据恢复,使数据回到修改之前的状态。 通过以上步骤,可以批量修改表中字段的编码格式。 ### 回答3: 批量修改表中字段的编码格式可通过以下步骤实现: 1. 首先,确定需要修改的表和字段。可以使用数据库管理工具(如MySQL Workbench)连接到数据库,并选择相应的表。 2. 探索表中的字段编码格式。可以使用SHOW COLUMNS语句查询表结构,找到需要修改编码格式的字段。 3. 建立备份。在进行批量修改之前,务必对表进行备份,以防止意删除或修改。 4. 创建修改的SQL语句。根据需要修改的字段编码格式,使用ALTER TABLE语句来更改表结构。例如,如果要将字段的编码格式从UTF-8更改为UTF-16,可以使用以下SQL语句: ALTER TABLE 表名 MODIFY 字段名 字段类型 CHARACTER SET utf16 COLLATE utf16_unicode_ci; 5. 执行SQL语句。在数据库管理工具中,将修改的SQL语句复制并粘贴到查询编辑器中,然后执行语句。 6. 检查修改结果。执行完SQL语句后,可以使用SHOW COLUMNS语句再次查询表结构,验证字段编码格式是否已成功修改。 7. 若需要批量修改多个字段,重复步骤4-6,直至所有需要修改编码格式的字段都完成修改。 8. 最后,确认所有的修改已正确完成,并根据需要清除备份。 总结:批量修改表中字段的编码格式需要通过数据库管理工具连接及查询表结构,根据需要创建修改的SQL语句,并在执行后检查结果以确保修改正确完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值