如果你试图在一个表上创建一个TEXT列,并在MySQL中给它一个默认值,你会得到一个错误(至少在Windows上)。我看不出为什么文本列不应该有默认值。MySQL文档中没有给出任何解释。这对我来说似乎不合逻辑(而且有点令人沮丧,因为我想要一个默认值!)。有人知道为什么这是不允许的吗?
当前回答
对于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'
这就解决了问题。
其他回答
如果对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'
这就解决了问题。
在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'))
它们的作用是一样的。
通过使用触发器,可以获得与默认值相同的效果
create table my_text
(
abc text
);
delimiter //
create trigger mytext_trigger before insert on my_text
for each row
begin
if (NEW.abc is null ) then
set NEW.abc = 'default text';
end if;
end
//
delimiter ;
Windows MySQL v5会抛出错误,但Linux和其他版本只会抛出警告。这个问题需要解决。WTF ?
也可以在MySQL bug跟踪器中看到修复此bug #19498的尝试:
2008年4月4日下午4:36: 在微软Windows上,“no DEFAULT”规则是一个错误,而在其他平台上,它通常是一个警告。虽然这不是一个bug,但如果你在一个宽松的平台上编写代码,然后在一个严格的平台上运行它,就有可能被这个问题困住:
就我个人而言,我认为这是一个bug。在谷歌上搜索“BLOB/TEXT列不能有默认值”会返回大约2,940个结果。其中大多数是在试图安装在一个系统上工作而在其他系统上不工作的DB脚本时的不兼容性报告。
I am running into the same problem now on a webapp I'm modifying for one of my clients, originally deployed on Linux MySQL v5.0.83-log. I'm running Windows MySQL v5.1.41. Even trying to use the latest version of phpMyAdmin to extract the database, it doesn't report a default for the text column in question. Yet, when I try running an insert on Windows (that works fine on the Linux deployment) I receive an error of no default on ABC column. I try to recreate the table locally with the obvious default (based on a select of unique values for that column) and end up receiving the oh-so-useful BLOB/TEXT column can't have a default value.
同样,不维护跨平台的基本兼容性是不可接受的,这是一个错误。
如何禁用MySQL 5 (Windows)的严格模式:
编辑/my.ini并寻找line sql模式= " STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION” 将其替换为 sql_mode = ' MYSQL40 ' 重新启动MySQL服务(假设它是mysql5) Net停止mysql5 启动mysql5
如果您有根/管理员权限,您可能能够执行
mysql_query("SET @@global.sql_mode='MYSQL40'");