MariaDB中JSON_UNQUOTE无法处理表情符号?如何用SQL提取值
解决MySQL中JSON_UNQUOTE返回Unicode表情符号为?的问题
核心解决方案
使用
JSON_VALUE直接解析JSON字符串中的值,它能正确处理Unicode转义序列:SELECT JSON_VALUE('"\\ud83d\\ude0a"', '$');执行后会返回正确的😊表情符号。
若坚持使用
JSON_UNQUOTE,需先将字符串转换为JSON类型再处理,确保MySQL正确解析代理对转义:SELECT JSON_UNQUOTE(CAST('"\\ud83d\\ude0a"' AS JSON));或者结合
JSON_EXTRACT使用:SELECT JSON_UNQUOTE(JSON_EXTRACT('"\\ud83d\\ude0a"', '$'));
问题原因
你遇到的?是因为\\ud83d和\\ude0a是UTF-16的代理对字符,单独的代理字符不属于有效的utf8mb4编码字符。直接用JSON_UNQUOTE处理字符串字面量时,MySQL没有将其当作JSON结构解析,而是直接转义单个代理字符,导致无效字符被替换为?。而JSON_VALUE或先转换为JSON类型后,MySQL会将这两个转义序列合并为一个完整的、有效的utf8mb4表情符号字符。
额外注意事项
如果是从varchar列中读取JSON,确保存储的JSON字符串格式正确,建议插入时使用JSON_OBJECT等JSON函数生成,避免手动转义出错:
INSERT INTO your_table (json_column) VALUES (JSON_OBJECT('emoji', '😊'));
后续读取时直接用JSON_VALUE(json_column, '$.emoji')即可获取正确值。
内容的提问来源于stack exchange,提问作者csirmazbendeguz
相关产品推荐
相关产品推荐

