MySQL JSON列更新报错:无法从binary字符集字符串创建JSON值
解决MySQL JSON列更新时的"Data truncation: cannot create a JSON value from a string with Character Set 'binary'"错误
我之前处理过完全相同的场景,这个问题其实是字符集不匹配导致的——虽然你的表用的是utf8mb4_bin字符集,但更新时传入的字符串被MySQL识别为binary字符集,它没法把二进制标记的字符串解析成有效的JSON值。
下面是几种针对性的解决办法:
1. 直接在SQL语句中转换字符集
如果是直接执行SQL更新,可以用CONVERT()函数把要插入的JSON字符串转换成utf8mb4字符集,示例:
UPDATE listing SET data = CONVERT('{"title": "Sample Listing", "price": 99}' USING utf8mb4) WHERE id = 1;
这样强制把字符串转换成JSON列兼容的字符集,就能正常解析了。
2. 检查并修正会话字符集设置
有时候是当前数据库会话的字符集配置有问题,导致传入的字符串被默认标记为binary。可以先查看当前会话的字符集:
SHOW VARIABLES LIKE 'character_set%';
如果看到character_set_client或者character_set_connection是binary,可以执行以下语句修正:
SET NAMES utf8mb4;
之后再执行更新语句就不会有问题了。
3. 程序端确保字符集正确
如果是通过应用程序(比如PHP、Python)更新数据,要确保数据库驱动使用utf8mb4字符集连接:
- PHP (PDO):连接时指定字符集
$pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'user', 'pass'); - Python (MySQLdb):
db = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="your_db", charset="utf8mb4")
这样程序发送的字符串会被正确标记为utf8mb4字符集,MySQL就能正常解析成JSON了。
需要注意的是,utf8mb4_bin确实是JSON列区分大小写比较的合适字符集,你的表设置没问题,问题核心就是输入字符串的字符集不兼容,只要把输入转换成utf8mb4就能解决。
内容的提问来源于stack exchange,提问作者Arslan
相关产品推荐
相关产品推荐

