[資料庫/MySQL]解決異常:Data truncation: Truncated incorrect DOUBLE value: 'dc5'
阿新 • • 發佈:2020-10-14
1 場景復現
- MySQL: 5.7.24-27
- 表結構
(兩張獨立的表)
[表RRR1] CREATE TABLE `RRR1` ( `R1` float NOT NULL COMMENT 'R1', `R2` float NOT NULL COMMENT 'R2' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='RRR1'; CREATE TABLE `Person11` ( `CSSJY111` varchar(3) DEFAULT NULL COMMENT '測試資料元011', `CSSJY107` int(3) DEFAULT NULL COMMENT '測試資料元007', `CSSJY106` int(3) DEFAULT NULL COMMENT '測試資料元006', `CSSJY112` datetime DEFAULT NULL COMMENT '測試資料元012', `CSSJY103` varchar(10) DEFAULT NULL COMMENT '測試資料元003', `CSSJY113` blob COMMENT '測試資料元013', `CSSJY104` varchar(10) DEFAULT NULL COMMENT '測試資料元004', `CSSJY108` varchar(10) DEFAULT NULL COMMENT '測試資料元008', `CSSJY102` varchar(10) DEFAULT NULL COMMENT '測試資料元002', `CSSJY109` varchar(10) DEFAULT NULL COMMENT '測試資料元009', `CSSJY101` varchar(10) DEFAULT NULL COMMENT '測試資料元101', `CSSJY110` date DEFAULT NULL COMMENT '測試資料元010', `CSSJY105` int(3) DEFAULT NULL COMMENT '測試資料元005' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='個人資訊';
- 異常SQL
DELETE FROM CJ_TEST.`RRR1` WHERE `R1` IN ( SELECT * FROM ( SELECT `R1` FROM CJ_TEST.`RRR1` WHERE `R1` IN ( SELECT `CSSJY111` FROM ( SELECT `CSSJY111` FROM `CJ_TEST`.`Person11` ORDER BY `CSSJY112` ASC, `CSSJY111` LIMIT 3 ) ttt -- 中間表 ttt ) ) B WHERE B.R1 = 1 -- 中間表 B )
報異常:
[Err] 1292 - Truncated incorrect DOUBLE value: 'dc5'
翻譯: [錯誤] 1292 - 資料截斷:截斷不正確的雙精度值:'dc5'
注: MySQL資料庫 必須帶中間表 ttt 和 B,否則 查詢會失敗
MySQL資料庫中 帶中間表 可避免異常:[Err] 1093 - You can't specify target table 'tableName' for update in FROM clause
FROM clause : FROM 子句
(翻譯: 你不能在DELETE/UPDATE這類修改操作的FROM子句中指定目標表——tableName。)
原因: DELETE/UPDATE (修改)操作 表tableName時,其FROM子句的實際操作表是 FROM子句內的虛表(結果集)
解決辦法: 將結果集臨時設定為中間表,讓修改操作的FROM物件為中間表
詳見:MySQL之You can't specify target table for update in FROM clause解決辦法 - CSDN
2 解決方案
SET SESSION sql_mode = '';
補充/延申: sql_mode的其它操作
select @@GLOBAL.sql_mode;
select @@SESSION.sql_mode; -- STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
Y 不足之處
追根到底,本質上是什麼原因導致的此異常?
sql_mode的配置起到了什麼作用?
為什麼這麼做可以成功解決?