两个 MySQL 服务器之间的行为差异(错误 1292)
Difference in behavior between two MySQL servers (Error 1292)
我们使用两台服务器(devsrv & qualifsrv),一台用于开发,一台用于我们应用程序的鉴定。
我在两台服务器上都有完全相同的 Zend 应用程序(应用程序的文件和配置相同)。
我有一个日志 table,其中我插入了执行的治疗和实现这些治疗所需的时间。
当我在服务器 devsrv 上的 table "Log" 中插入一行时,没问题。
当我在 qualifsrv 服务器上的 table "Log" 中执行完全相同的查询时,MySQL returns 一个错误说明在 1292 log_duration 字段的值不正确。
我的日志table :
CREATE TABLE `T_log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`log_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`log_priority` varchar(10) DEFAULT NULL,
`log_priority_name` varchar(20) DEFAULT NULL,
`log_event` varchar(255) DEFAULT NULL,
`log_commentaire` longtext,
`log_impacted_row` int(10) DEFAULT NULL,
`log_duration` time DEFAULT NULL,
`vag_id` int(11) DEFAULT NULL,
PRIMARY KEY (`log_id`),
KEY `idx_log_priority` (`log_priority`) USING BTREE,
KEY `idx_log_date` (`log_date`) USING BTREE,
KEY `idx_log_event` (`log_event`) USING BTREE,
KEY `idx_impacted_row` (`log_impacted_row`) USING BTREE,
KEY `fk_vag_id` (`vag_id`) USING BTREE,
CONSTRAINT `T_log_ibfk_1` FOREIGN KEY (`vag_id`) REFERENCES `T_vague` (`vag_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4479 DEFAULT CHARSET=utf8;
查询:
INSERT INTO `T_log` (
`log_priority`,
`log_priority_name`,
`log_event`,
`log_commentaire`,
`log_impacted_row`,
`log_duration`,
`vag_id`
)
VALUES
(
6,
"INFO",
"TEST",
"UPDATE",
87552,
"20s",
15
)
当我在 devsrv 上插入时:
Affected rows: 1
(log_duration 值是:日志 table 中的 00:00:20
)
当我在 qualifsrv 上插入时:
[Err] 1292 - Incorrect time value: '20s' for column 'log_duration' at row 1
为什么两个服务器之间的行为存在差异?
我发现了不同。这是因为全局变量 sql_mode 配置为不允许字段预期值以外的其他值。
更多信息在这里:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
我们使用两台服务器(devsrv & qualifsrv),一台用于开发,一台用于我们应用程序的鉴定。 我在两台服务器上都有完全相同的 Zend 应用程序(应用程序的文件和配置相同)。
我有一个日志 table,其中我插入了执行的治疗和实现这些治疗所需的时间。
当我在服务器 devsrv 上的 table "Log" 中插入一行时,没问题。 当我在 qualifsrv 服务器上的 table "Log" 中执行完全相同的查询时,MySQL returns 一个错误说明在 1292 log_duration 字段的值不正确。
我的日志table :
CREATE TABLE `T_log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`log_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`log_priority` varchar(10) DEFAULT NULL,
`log_priority_name` varchar(20) DEFAULT NULL,
`log_event` varchar(255) DEFAULT NULL,
`log_commentaire` longtext,
`log_impacted_row` int(10) DEFAULT NULL,
`log_duration` time DEFAULT NULL,
`vag_id` int(11) DEFAULT NULL,
PRIMARY KEY (`log_id`),
KEY `idx_log_priority` (`log_priority`) USING BTREE,
KEY `idx_log_date` (`log_date`) USING BTREE,
KEY `idx_log_event` (`log_event`) USING BTREE,
KEY `idx_impacted_row` (`log_impacted_row`) USING BTREE,
KEY `fk_vag_id` (`vag_id`) USING BTREE,
CONSTRAINT `T_log_ibfk_1` FOREIGN KEY (`vag_id`) REFERENCES `T_vague` (`vag_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4479 DEFAULT CHARSET=utf8;
查询:
INSERT INTO `T_log` (
`log_priority`,
`log_priority_name`,
`log_event`,
`log_commentaire`,
`log_impacted_row`,
`log_duration`,
`vag_id`
)
VALUES
(
6,
"INFO",
"TEST",
"UPDATE",
87552,
"20s",
15
)
当我在 devsrv 上插入时:
Affected rows: 1
(log_duration 值是:日志 table 中的 00:00:20
)
当我在 qualifsrv 上插入时:
[Err] 1292 - Incorrect time value: '20s' for column 'log_duration' at row 1
为什么两个服务器之间的行为存在差异?
我发现了不同。这是因为全局变量 sql_mode 配置为不允许字段预期值以外的其他值。
更多信息在这里:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html