【问题标题】:MySQL default value for TEXT column behaving erratically, why?TEXT 列的 MySQL 默认值行为不正常,为什么?
【发布时间】:2015-03-16 02:59:16
【问题描述】:

我试图做的是避免在 INSERT 中列出我的 TEXT 列,它们会有一个默认的 ''(空字符串)。

我设法为我的 TEXT 列设置(见下文)一个默认的 '' 值,但它产生了一个警告,我看不到我的表结构发生了什么变化。

请检查下面的代码以重现问题。

DROP TABLE IF EXISTS `text_test`;

CREATE TABLE `text_test` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `text` TEXT NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;
-- created OK

SHOW CREATE TABLE `text_test`;
-- CREATE TABLE `text_test` (
--   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
--   `text` text COLLATE utf8_unicode_ci NOT NULL,
--   PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
-- no surprises here...

INSERT INTO `text_test` () VALUES ();
-- warning: text has no default value

SELECT * FROM `text_test`;
-- id=1, text=''

ALTER TABLE `text_test` 
    CHANGE COLUMN `text` `text` TEXT NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci' AFTER `id`;
-- warning: blob/text cannot have default...

SHOW CREATE TABLE `text_test`;
-- CREATE TABLE `text_test` (
--   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
--   `text` text COLLATE utf8_unicode_ci NOT NULL,
--   PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
-- no surprises, seems like the table did not change at all...

INSERT INTO `text_test` () VALUES ();
-- no warning generated, but why if the table structure is still the same??

SELECT * FROM `text_test`;
-- id=1, text=''
-- id=2, text=''

我的服务器信息:

SHOW VARIABLES LIKE "%version%";
-- "Variable_name"           "Value"
-- "innodb_version"          "5.1.73-14.6"
-- "protocol_version"        "10"
-- "version"                 "5.1.73-rel14.11-log"
-- "version_comment"         "(Percona Server (GPL), 14.11)"
-- "version_compile_machine" "x86_64"
-- "version_compile_os"      "debian-linux-gnu"

【问题讨论】:

  • 你不能给 TEXT 列一个默认值
  • @Umair 和 @Strawberry 感谢 cmets ...这是一个类似的问题,但并不完全相同。我试图理解为什么我的第一个INSERT 会生成警告,而我的第二个INSERT 不会生成警告,如果它们相同并且理论上表格相同...任何帮助将不胜感激!谢谢

标签: mysql percona


【解决方案1】:

MySQL 手册:“BLOB 和 TEXT 列不能有 DEFAULT 值”。

警告是故意的,用于自动创建表和暗示期望默认值的代码的情况。

忽略并继续:)

【讨论】:

  • 嗨...是的,我明白这一点。将列更改为DEFAULT '' 后,它会发出警告,说它不能有 DEFAULT 到目前为止它是正常的(它不能有默认值)。但是,在我们这样做之后,如果您不提供值,表格将停止为 TEXT 字段生成警告……为什么上面的第一个 INSERT 会生成 WARNING 而第二个没有?这就是我很好奇...
  • 通读 MySQL 上的开发人员线程,很可能警告只是作为标准应用。我还怀疑,如果在创建表期间提供了警告,则不需要在插入期间创建它,因为该警告被认为是对默认值的隐含期望的全部内容。换句话说,代码在创建过程中已经被警告过。现在,它是如何存储它的,以及它是在什么“标准”前提下应用的,这一切都超出了我的想象。
  • 嗨兰斯。这种行为对我来说是新的,我不知道表结构引发的一些警告可能会从数据操作中删除警告。恕我直言,这是不稳定的,因为一旦您转储表并加载转储文件,可能会引发几个警告。对于那些在发出警告时回滚和中止脚本的人(我是唯一这样做的人吗?)这可能是一个问题。当然,现在我知道了,我可以做好准备了。
  • 顺便说一句,你能指出我这个关于 MySQL 的开发者线程吗?我很想了解更多...非常感谢!
  • 当然,我从这里开始,然后只是跳来跳去......对不起,从 7 小时前回溯我的确切步骤很无聊:) bugs.mysql.com/bug.php?id=19498
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2019-02-01
  • 2011-09-17
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多