【问题标题】:Trigger not working with longtext field触发器不适用于长文本字段
【发布时间】:2017-04-13 09:38:36
【问题描述】:

我有 2 个 MySQL 表名 uploadsuploads_log

  • uploads 表有一个字段名json_values(数据类型:longtext)
  • uploads_log 表有 2 个字段 old_valuenew_value(数据类型:longtext)

uploads 表的 UPDATE 之后,我编写了一个触发器,它将 uploads.json_values 的全部内容放入 uploads_log 表的 old_value 中,新值。

触发是

BEGIN
    IF (NEW.json_values != OLD.json_values) THEN
        INSERT INTO uploads_log (`file_id`, `user_id`, `field_name`, `old_value`, `new_value`, `ip`, `created_at`)
        VALUES (OLD.`file_id`,
                OLD.`user_id`,
                'json_values',
                OLD.json_values,
                NEW.json_values,
                NEW.user_ip,
                NOW());
    END IF;
END

我的问题是:当我在 uploads.json_values 中编辑小字符串时,我的触发器工作正常,但是当我编辑一些非常长的字符串时,例如 378369 个字符长 .我收到以下错误。

SQLSTATE[42000]:语法错误或访问冲突:1118 行大小太大 (> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀是内联存储的。

我尝试调试删除触发器并使用长字符串编辑uploads.json_values 的问题,它可以正常工作,我手动将该长字符串插入uploads_log.old_value,然后它也可以正常工作,所以问题出在触发器上。

触发器是否有长度限制?

两个表都使用存储引擎:InnoDB 和 MySQL 版本是 5.6.21。

uploads表结构

CREATE TABLE `uploads` (
 `file_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `json_values` longtext COLLATE utf8_unicode_ci NOT NULL,
 `read_values` longtext COLLATE utf8_unicode_ci,
 `user_ip` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`file_id`),
 KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34444 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

uploads_log表结构

CREATE TABLE `uploads_log` (
 `action_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `file_id` int(11) unsigned DEFAULT NULL,
 `user_id` int(11) unsigned DEFAULT NULL,
 `field_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `old_value` longtext COLLATE utf8_unicode_ci,
 `new_value` longtext COLLATE utf8_unicode_ci,
 `ip` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
 `created_at` datetime DEFAULT NULL,
 PRIMARY KEY (`action_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我找到了this questionthis one,但它与UPDATE触发器无关。

非常感谢任何帮助/建议。

谢谢。

【问题讨论】:

  • 请添加 show create table 的输出
  • 查看this answer
  • @e4c5:我已经用表格结构更新了我的问题。和 Vatev 我也在阅读这个答案,但很难消化它。所以谷歌搜索它。
  • 触发器在哪个表上?
  • @e4c5: 触发器写入uploads 表中,并在表更新后触发。

标签: mysql triggers phpmyadmin


【解决方案1】:

我也遇到了一些类似的问题,但没有触发这个question 帮助了我。

将位于C:\xampp\mysql\bin\my.ini 中的innodb_log_file_size 值(如果您使用 XAMPP)更改为高于 5M 的值。

或者正如@Vatev 所指出的,您可以设置innodb_log_file_size = 128M

您可以使用此 MySQL 命令获取 innodb_log_file_size 值,它会以字节为单位为您提供结果。

【讨论】:

  • 谢谢,它在本地/开发服务器上确实对我有用,但是有没有其他方法可以实现这一点,因为我不知道我是否可以选择更改共享主机上的 MySQL 配置.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2016-01-17
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多