如果你试图在一个表上创建一个 TEXT 列,并在 MySQL 中给它一个默认值,你会得到一个错误(至少在 Windows 上)。我看不出文本列不应该有默认值的任何原因。MySQL 文档没有给出解释。这对我来说似乎不合逻辑(而且有点令人沮丧,因为我想要一个默认值!)。有人知道为什么不允许这样做吗?
Windows MySQL v5 会引发错误,但 Linux 和其他版本只会引发警告。这需要修复。 怎么回事?
另请参阅 MySQL Bugtracker 中将其修复为 bug #19498 的尝试:
Bryce Nesbitt 2008 年 4 月 4 日下午 4:36: 在 MS Windows 上,“no DEFAULT”规则是一个错误,而在其他平台上它通常是一个警告。虽然不是错误,但如果您在宽松的平台上编写代码,然后在严格的平台上运行它,则可能会被此困住:
就个人而言,我确实认为这是一个错误。在 Google 上搜索“BLOB/TEXT 列不能有默认值”会返回大约 2,940 个结果。其中大多数是在尝试安装在一个系统上运行但在其他系统上运行的数据库脚本时出现不兼容的报告。
我现在在为我的一个客户修改的 webapp 上遇到了同样的问题,最初部署在 Linux MySQL v5.0.83-log 上。我正在运行 Windows MySQL v5.1.41。即使尝试使用最新版本的 phpMyAdmin 来提取数据库,它也不会报告相关文本列的默认值。然而,当我尝试在 Windows 上运行插入(在 Linux 部署上运行良好)时,我收到 ABC 列上没有默认值的错误。我尝试使用明显的默认值(基于该列的唯一值的选择)在本地重新创建表,并最终收到 oh-so-useful BLOB/TEXT column can’t have a default value 。
同样,不保持跨平台的基本兼容性是不可接受的,并且是一个错误。
如何在 MySQL 5 (Windows) 中禁用严格模式:
编辑 /my.ini 并查找行
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
将其替换为
sql_mode='MYSQL40'
重启MySQL服务(假设是mysql5)
net stop mysql5
net start mysql5
如果您有 root/admin 访问权限,您也许可以执行
mysql_query("SET @@global.sql_mode='MYSQL40'");