视图查询中文乱码根源在底层表字段collation不统一,需用information_schema.columns查列级排序规则并确保一致;concat等函数参与时须显式指定collate,且文件编码、导入参数、视图定义中所有隐含collation均需对齐。

视图查询中文乱码,先查列级 COLLATION 是否一致
视图本身不存数据,只存 SELECT 语句,所以乱码根源几乎总在底层表字段的 COLLATION 不统一。执行:SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND COLUMN_NAME IN ('name', 'title') AND COLLATION_NAME IS NOT NULL;
如果结果里混着 utf8mb4_unicode_ci 和 utf8mb4_general_ci,甚至出现 latin1_swedish_ci,视图 JOIN 或 CONCAT 就会触发隐式转换失败或降级。
MySQL 视图中 CONCAT/REPLACE 出现乱码,别只改表字符集
即使整张表已用 ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,视图里用 CONCAT(col_a, col_b) 仍可能乱码——因为 MySQL 会按“较窄字符集”自动降级结果。比如 col_a 是 utf8mb4,col_b 是 utf8(即 utf8mb3),拼接结果默认变成 utf8,中文就变 ?。
- 检查每个参与拼接的字段是否都显式声明了
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 视图定义中强制指定拼接结果的排序规则:
CONCAT(col_a, col_b) COLLATE utf8mb4_unicode_ci - 避免在视图里混用不同来源的字段:比如从旧库
JOIN过来的表,其字段COLLATION可能仍是utf8_general_ci
SQL Server 视图中文显示为方块或问号,重点看列级 COLLATE
ALTER DATABASE COLLATE Chinese_PRC_CI_AS 对已有字段无效。视图查出来乱码,90% 是因为字段定义没写死 COLLATE。建表时若漏了,现在必须逐列修正:
- 查当前列排序规则:
SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('your_view_base_table') AND name = 'name'; - 修改字段:
ALTER TABLE your_table ALTER COLUMN name NVARCHAR(50) COLLATE Chinese_PRC_CI_AS; - 视图里涉及跨库 JOIN 时,两边字段
COLLATE必须一致,否则WHERE a.name = b.name直接报错或结果为空
Navicat 导入 SQL 文件创建视图后乱码,注意文件编码与服务端支持
导出的 SQL 文件若来自 MySQL 8.0,里面可能含 utf8mb4_0900_ai_ci——MariaDB 或老版本 MySQL 不认。还原时报 Unknown collation,不是 Navicat 设置问题,而是 SQL 文本本身不兼容。
- 用文本编辑器全局替换:
utf8mb4_0900_ai_ci→utf8mb4_unicode_ci - 检查
CREATE VIEW语句中所有COMMENT、INDEX、PARTITION子句,这些地方也可能隐含该排序规则 - 文件真实编码必须是 UTF-8 无 BOM;Windows 下 VS Code 默认存成 UTF-8 with BOM,MySQL 会跳过开头 3 字节,导致后续中文偏移解码
- 导入命令必须带参数:
mysql --default-character-set=utf8mb4 -u root -p db_name










