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

MySQL 8.0.31中JSON列默认值设置失败问题求助

MySQL 8.0.31 JSON列默认值问题解析

1. 为什么DEFAULT ('[]')触发1101错误?

虽然MySQL 8.0.13+允许JSON列使用表达式默认值,但('[]')的写法不符合要求——它被MySQL判定为普通字符串字面量的包裹形式,而非合法的JSON表达式。

MySQL对JSON列的默认值有明确规则:必须是能生成合法JSON值的表达式,不能直接使用字符串字面量作为默认值(这是旧版本对BLOB/TEXT类列的限制,即使8.0.13放开了JSON列的默认值支持,语法上仍要求用表达式形式提供合法JSON)。因此,当你写DEFAULT ('[]')时,MySQL仍按旧逻辑判定为“非法的字符串默认值”,抛出1101错误。

2. 为什么DEFAULT (QUOTE('[]'))能执行成功?

QUOTE('[]')是一个合法的MySQL表达式,它会返回字符串'[]'——这个字符串本身是合法的JSON空数组格式。MySQL会执行该表达式,并将结果作为JSON列的默认值,完全符合JSON列对默认值的要求,因此ALTER语句能成功执行。

3. 为什么SHOW COLUMNS显示的默认值是quote(_utf8mb3\'[]\')?

SHOW COLUMNS会原样存储并显示你设置的默认值表达式,而不是表达式执行后的结果。因为你设置的是表达式默认值(QUOTE('[]')),而非直接的JSON字面量。

如果希望默认值显示更简洁(比如类似普通字符串默认值的形式),可以改用以下两种写法:

  • 使用JSON构造函数生成空数组:
    ALTER TABLE `your_table` ALTER COLUMN `your_json_col` SET DEFAULT (JSON_ARRAY()), ALGORITHM=INSTANT;
    
  • 将字符串显式转为JSON类型:
    ALTER TABLE `your_table` ALTER COLUMN `your_json_col` SET DEFAULT (CAST('[]' AS JSON)), ALGORITHM=INSTANT;
    

这两种方式设置后,SHOW COLUMNS会分别显示json_array()和cast(_utf8mb3'[]' as json),插入新行时默认值都是正确的空JSON数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:24:57