小编典典

为什么文本列在 MySQL 中不能有默认值?

all

如果你试图在一个表上创建一个 TEXT 列,并在 MySQL 中给它一个默认值,你会得到一个错误(至少在 Windows
上)。我看不出文本列不应该有默认值的任何原因。MySQL
文档没有给出解释。这对我来说似乎不合逻辑(而且有点令人沮丧,因为我想要一个默认值!)。有人知道为什么不允许这样做吗?


阅读 153

收藏
2022-06-28

共1个答案

小编典典

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'");
2022-06-28