如何在MySQL查询的列别名中使用emoji或utf8mb4字符?
问题解答
1. 是否可修改AWS RDS上的MySQL服务器设置使该查询直接生效?
可以,核心是统一MySQL全局和会话的字符集配置为utf8mb4,避免别名中的utf8mb4字符被强制转换为不支持emoji的utf8mb3。具体操作:
- 登录AWS RDS控制台,找到目标实例关联的参数组
- 修改以下全局参数:
character_set_server = utf8mb4collation_server = utf8mb4_unicode_ci(或其他适配的utf8mb4排序规则)- 添加
init_connect = SET NAMES utf8mb4(确保新连接默认使用utf8mb4字符集)
- 保存参数组后重启RDS实例,使参数生效
- 同步修改SuiteCRM的
config.php配置文件,将dbconfigoption中的charset值设为utf8mb4,确保应用端连接时直接指定utf8mb4
2. 是否有改写查询的方法使其正常运行?
有两种可行方式:
- 方式一:先设置会话字符集再执行查询
在目标查询前先运行会话级字符集命令:
再执行带emoji别名的查询:SET NAMES utf8mb4;SELECT count(*) c FROM (SELECT `cases`.id AS 'ID_😀0', `cases`.id AS 'cases_id' FROM `cases` WHERE cases.deleted = 0 ) AS n; - 方式二:用反引号包裹别名
对含特殊字符的别名用反引号包裹,避免潜在语法问题(前提是会话字符集已设为utf8mb4):SELECT count(*) c FROM (SELECT `cases`.id AS `ID_😀0`, `cases`.id AS `cases_id` FROM `cases` WHERE cases.deleted = 0 ) AS n;
3. 这是否是MySQL的局限,emoji或utf8mb4专属字符无法用于列别名?
不是MySQL的局限。MySQL 8.0完全支持在列别名中使用utf8mb4字符(包括emoji),报错的本质是连接会话或服务器的字符集配置存在utf8mb3(旧版utf8)的环节,导致含emoji的别名被强制从utf8mb4转换为不支持emoji的utf8mb3,触发错误码3854。只要端到端字符集统一为utf8mb4,别名中即可正常使用emoji。
内容的提问来源于stack exchange,提问作者2xaronl
相关产品推荐
相关产品推荐

