1. 程式人生 > 實用技巧 >[資料庫/MySQL]解決異常:Data truncation: Truncated incorrect DOUBLE value: 'dc5'

[資料庫/MySQL]解決異常:Data truncation: Truncated incorrect DOUBLE value: 'dc5'

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的配置起到了什麼作用?
為什麼這麼做可以成功解決?

X 參考與推薦文獻