You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过MySQL存储过程插入Emoji表情的问题求助

解决存储过程插入含Emoji文本失败的问题

先梳理下你的核心问题:

  • 你的MySQL大部分字符集配置已经设置为utf8mb4(支持4字节Emoji字符)
  • 直接执行INSERT语句能正常插入带Emoji的文本
  • 调用逻辑一致的存储过程时,却抛出Incorrect string value: '\xF0\x9F\x8D\x89\xF0\x9F...'的编码错误

问题根源

虽然全局和会话的字符集是utf8mb4,但存储过程的字符串参数可能默认使用了utf8字符集(注意:MySQL的utf8实际是utf8mb3,仅支持3字节字符,无法处理Emoji这类4字节字符)。当你把含Emoji的文本传入存储过程的p_caption参数时,参数本身会因为字符集不兼容出现编码截断,最终插入时触发报错。

验证问题

你可以先查询存储过程参数的字符集,确认是否是这个原因:

SELECT 
  PARAMETER_NAME, 
  DATA_TYPE, 
  CHARACTER_SET_NAME 
FROM INFORMATION_SCHEMA.PARAMETERS 
WHERE SPECIFIC_NAME = 'sp_SaveOrderDetails';

如果p_caption的CHARACTER_SET_NAME显示为utf8而非utf8mb4,那就坐实了这个问题。

解决方案

重新创建存储过程,明确指定参数的字符集为utf8mb4,同时确保创建时的会话字符集正确:

  1. 先切换会话字符集(避免存储过程元数据用错字符集):
SET NAMES utf8mb4;
  1. 删除旧的存储过程:
DROP PROCEDURE IF EXISTS sp_SaveOrderDetails;
  1. 重新创建存储过程,给字符串参数显式指定utf8mb4字符集(顺便修正了你原存储过程里硬编码值的笔误,改为使用传入的参数):
DELIMITER $$
CREATE PROCEDURE `sp_SaveOrderDetails`(
  IN p_orderDetailsID VARCHAR(40) CHARACTER SET utf8mb4, 
  IN p_orderId VARCHAR(40) CHARACTER SET utf8mb4, 
  IN p_caption TEXT CHARACTER SET utf8mb4
) 
BEGIN 
  INSERT INTO `orderdetails` (`OrderDetailsID`,`OrderId`,`Caption`) 
  VALUES(p_orderDetailsID, p_orderId, p_caption);
END$$
DELIMITER ;
  1. 再次调用存储过程测试:
CALL `sp_SaveOrderDetails`('123456789', 'a1b16d012dcff03af923005ef9f98eb5','Happy birthday dear Ryan,,馃崏馃崐馃挊鉂わ笍馃挄');

额外注意点

  • 确认orderdetails表的Caption字段确实是TEXT类型且字符集为utf8mb4,可以用DESCRIBE orderdetails;检查
  • 后续创建存储过程时,建议都显式指定字符串参数的字符集,避免类似编码问题重复出现

内容的提问来源于stack exchange,提问作者Neemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:52