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
相关产品推荐
相关产品推荐

