В MySQL 5.6.13 с режимом SQL "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
" следующий запрос работает нормально, но с предупреждениями:
UPDATE Company SET company_CurrentYearValueGBP = COALESCE((
SELECT SUM(
(COALESCE(salesdata_Month01Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month02Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month03Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month04Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month05Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month06Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month07Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month08Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month09Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month10Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month11Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
(COALESCE(salesdata_Month12Amount,0) / IF(salesdata_ExchangeRate<>'',salesdata_ExchangeRate,1) ) +
0) FROM SalesData
WHERE salesdata_SalesDataTypeID = 3
AND salesdata_CompanyID = company_ID
AND salesdata_SalesYearID = 6
AND NOT salesdata_IsBeingProcessed
),0)
Вывод:
0 row(s) affected, 5 warning(s):
1265 Data truncated for column 'company_CurrentYearValueGBP' at row 127
1265 Data truncated for column 'company_CurrentYearValueGBP' at row 127
1265 Data truncated for column 'company_CurrentYearValueGBP' at row 127
1265 Data truncated for column 'company_CurrentYearValueGBP' at row 127
1265 Data truncated for column 'company_CurrentYearValueGBP' at row 127
Rows matched: 1470 Changed: 0 Warnings: 5
В MySQL 5.7.14 с режимом SQL "STRICT_TRANS_TABLES
" этот же запрос создает следующую ошибку:
Error Code: 1292. Truncated incorrect DECIMAL value: ''
Я понимаю, почему происходит ошибка (из-за сравнения salesdata_ExchangeRate <>''), но может ли кто-нибудь объяснить, почему в MySQL 5.6, несмотря на то, что строгий режим включен, что запрос только выдает предупреждения и не прерывается с ошибкой?Поведение кажется разным между двумя версиями.
Обновление 1 Создана простая таблица со следующей структурой для MySQL 5.6.13 и MySQL 5.7.14:
Добавлены следующие записи:
Выполнение следующего запроса приводит к той же ошибке в MySQL5.7.14:
UPDATE testtable
SET testtable_CalculatedValue = IF(testtable_DecimalValue<>'',testtable_DecimalValue,0)
WHERE testtable_ID > 0
Error Code: 1292. Truncated incorrect DECIMAL value: ''
В MySQL 5.6.13 testtable_CalculatedValue устанавливается равным 1,35, как и ожидалось.