某天,给表新增一个字段,类型为 TEXT,想设置默认值为空字符串,SQL 语句如下:

ALTER TABLE `table1` ADD `content` TEXT NOT NULL DEFAULT '';

执行的时候报错了: 

#1101 - BLOB, TEXT, GEOMETRY or JSON column 'content' can't have a default value

就是说,BLOB、TEXT、GEOMETRY、JSON 这些类型的字段是不能设置默认值的。这是由于 MySQL 5.7 默认启用了严格模式导致的。

修改配置文件中的 sql-mode 可以解决这个问题,但是不建议改,因为如果做了集群的话很难保证每台服务器这个设置都统一。

 

两种解决办法

方法一:TEXT 类型的长度是 65535 个字符,VARCHAR 类型的最大长度也是 65535,如果存储的字段没有这么长,完全可以用 VARCHAR 代替 TEXT。但是对于 MEDIUMTEXT、LONGTEXT 类型就不行了。

方法二:把SQL 语句中的 NOT NULL 限制去掉,允许字段为 NULL,即:

ALTER TABLE `table1` ADD `content` TEXT;

这样在插入数据的时候,如果没有指定值,该字段默认就是 NULL。但是这破坏了不用 NULL 的设计原则。

以上两种方法,自己根据情况取舍。