在将测试库的新增表通过 Navicat 向阿里云的 MySql 数据库复制后,发现前端页面申请查问失败。
指标数据库的默认排序规定是utf8mb4_0900_ai_ci
,已存在的表都应用了这个编码,而起源数据库的排序规定是utf8mb4_unicode_ci
,新复制的表都用的是后者。
数据库进行多表关联查问时,如果两张表的字符集或者排序规定不统一,就会报错。
从 Navicat 里手动批改编码效率很低,若只是改一下表,也用不了多久,但问题是只改表是不行的,表内所有 varchar 的编码并不会跟着表走。
因而还是须要走批量操作的路子。
批量批改字段
SELECT
CONCAT(
'ALTER TABLE `',
TABLE_NAME,
'` MODIFY `',
COLUMN_NAME,
'`',
DATA_TYPE,
'(',
CHARACTER_MAXIMUM_LENGTH,
') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci',
(CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE ''END),';'
)
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = '数据库名'
AND (
DATA_TYPE = 'varchar'
OR DATA_TYPE = 'char')
批量批改表
SELECT
CONCAT('ALTER TABLE', TABLE_NAME, 'CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = '数据库名';
将以上 SQL 语句中的 utf8mb4
、utf8mb4_unicode_ci
、 数据库名
别离改成本人须要的值,胜利执行后,将执行后果即 SQL 语句复制进去,再执行这些 SQL 语句即可。