如何解决json_decode获取含Emoji字符无法存入MySQL的问题
嘿,我帮你捋捋这个Emoji存库的问题——你已经改了表的排序规则,但还缺几个关键步骤,咱们一步步来解决:
1. 先搞定数据库连接的编码(最容易漏的点!)
就算表已经设为utf8mb4_general_ci,如果PHP和数据库的连接还是用旧的utf8(本质是utf8mb3,只支持3字节字符,Emoji是4字节),那Emoji依然存不进去。你需要在连接数据库时明确指定编码为utf8mb4:
- 如果你用PDO:
$pdo = new PDO( 'mysql:host=你的主机;dbname=你的库名;charset=utf8mb4', '用户名', '密码', [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'] );
- 如果你用mysqli:
$conn = mysqli_connect('你的主机', '用户名', '密码', '你的库名'); mysqli_set_charset($conn, 'utf8mb4');
2. 确认接收的原始数据编码正确
有时候php://input的编码可能异常,你可以先做个编码校验和转换,确保是UTF-8:
$rawInput = file_get_contents("php://input"); // 检测并转换编码为UTF-8 if (mb_detect_encoding($rawInput) !== 'UTF-8') { $rawInput = mb_convert_encoding($rawInput, 'UTF-8', mb_detect_encoding($rawInput)); } $update = json_decode($rawInput, JSON_UNESCAPED_UNICODE);
3. 插入时用预处理语句,同时检查字段类型
- 确保存储名字的字段(比如
first_name、last_name)是VARCHAR或TEXT类型,并且长度足够(Emoji占4字节,utf8mb4下1个Emoji算1字符,别把字段长度设得太苛刻); - 一定要用预处理语句插入数据,别直接拼接SQL,这样既能防注入,也能保证编码正确传递:
// PDO示例 $stmt = $pdo->prepare("INSERT INTO 你的表名 (first_name, last_name) VALUES (:first, :last)"); $stmt->execute([ ':first' => $firstname, ':last' => $lastname ]);
4. 排查JSON解码是否有问题
有时候原始JSON的编码错误会导致json_decode截断数据,你可以加个错误检查:
$update = json_decode($rawInput, JSON_UNESCAPED_UNICODE); if (json_last_error() !== JSON_ERROR_NONE) { // 输出错误信息,方便排查 echo 'JSON解码错误: ' . json_last_error_msg(); }
核心逻辑就是:连接编码必须是utf8mb4 + 表和字段的utf8mb4配置 + 预处理插入,这三个环节都到位,Emoji就能正常存入数据库了。
内容的提问来源于stack exchange,提问作者kamal gharejeloo
相关产品推荐
相关产品推荐

