如果你试图在一个表上创建一个TEXT列,并在MySQL中给它一个默认值,你会得到一个错误(至少在Windows上)。我看不出为什么文本列不应该有默认值。MySQL文档中没有给出任何解释。这对我来说似乎不合逻辑(而且有点令人沮丧,因为我想要一个默认值!)。有人知道为什么这是不允许的吗?
当前回答
在2018-10-22发布的MySQL 8.0.13中增加了使用表达式作为默认值的支持,适用于TEXT, JSON, BLOB和GEOMETRY。
你仍然不能写:
create table foo(bar text default 'baz')
但是你现在可以这样写:
create table foo(bar text default ('baz'))
它们的作用是一样的。
其他回答
作为主要问题:
有人知道为什么这是不允许的吗?
仍然没有答案,我做了一个快速搜索,并从MySQL Bugs的MySQL开发人员那里找到了一个相对较新的补充:
[17 Mar 2017 15:11] Ståle Deraas 开发者发布: 这确实是一个有效的特性请求,乍一看,添加它似乎很简单。但是TEXT/BLOBS值并不是直接存储在用于读取/更新表的记录缓冲区中。因此,为它们分配默认值有点复杂。
这并不是一个明确的答案,但至少是“为什么”问题的一个起点。
与此同时,我将围绕它编写代码,或者使列为空,或者显式地为应用程序代码中的每个插入分配一个(默认“)值……
支持TEXT/BLOB列中的DEFAULT 是一个 MySQL Bug追踪器中的特性请求(Bug #21532)。
我知道我不是唯一一个希望在TEXT列中设置默认值的人。 我认为MySQL的后续版本应该支持这个特性。
这个问题在MySQL 5.0版本中无法解决, 因为如果有人试图在不支持该特性的(当前)数据库和支持该特性的数据库之间来回传输数据库,显然会导致不兼容和数据丢失。
在2018-10-22发布的MySQL 8.0.13中增加了使用表达式作为默认值的支持,适用于TEXT, JSON, BLOB和GEOMETRY。
你仍然不能写:
create table foo(bar text default 'baz')
但是你现在可以这样写:
create table foo(bar text default ('baz'))
它们的作用是一样的。
如果对mySQL引擎没有任何深入的了解,我会说这听起来像是一种节省内存的策略。我想原因就在这段文档里:
每个BLOB或TEXT值在内部由一个单独分配的对象表示。这与所有其他数据类型形成对比,这些数据类型在打开表时为每列分配一次存储。
预先填充这些列类型似乎会导致内存使用和性能损失。
对于Ubuntu 16.04:
如何禁用MySQL 5.7中的严格模式
编辑/etc/mysql/mysql.conf.d/mysqld.cnf文件
如果在mysql.cnf中存在以下行
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
然后将其替换为
sql_mode='MYSQL40'
否则
只需在mysqld.cnf中添加下面这行
sql_mode='MYSQL40'
这就解决了问题。