我有一個簡單的表格(資料格式錯誤):
========
| weight |
========
| 100г |
--------
| 200 г |
--------
| 300гр |
--------
| 400 гр |
--------
| 500г. |
--------
當我選擇時,我可以將格式應用于資料:
SELECT CONCAT((weight 0), ' г') formatted FROM t;
===========
| formatted |
===========
| 100 г |
-----------
| 200 г |
-----------
| 300 г |
-----------
| 400 г |
-----------
| 500 г |
-----------
現在我嘗試使用上述格式更新資料:
UPDATE t SET weight = CONCAT((weight 0), ' г');
但得到了錯誤:
截斷不正確的 DOUBLE 值:'200 -'
這里的小提琴
uj5u.com熱心網友回復:
在您的 SELECT 上出現相同的警告:
mysql> SELECT CONCAT((weight 0), ' г') formatted FROM t;
-----------
| formatted |
-----------
| 100 г |
| 200 г |
| 300 г |
| 400 г |
| 500 г |
-----------
5 rows in set, 5 warnings (0.00 sec)
mysql> show warnings;
--------- ------ --------------------------------------------
| Level | Code | Message |
--------- ------ --------------------------------------------
| Warning | 1292 | Truncated incorrect DOUBLE value: '100 г' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '200 г' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '300 г' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '400 г' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '500 г' |
--------- ------ --------------------------------------------
CAST() 上的檔案解釋了這一點:
包含必須在轉換前截斷的非數字字符的字串值會引發警告,如下所示:...
如果您只是執行 SELECT 以回傳結果集,則警告不是致命的,但是有關 SQL 模式的檔案解釋說:
在某些值可能超出范圍或在表中插入或洗掉無效行的情況下,嚴格 SQL 模式適用于以下陳述句:
UPDATE 是這些陳述句之一。超出范圍的值只會在您選擇它時導致警告,但在嚴格模式下,您不能在插入或更新資料時使用這種狡猾的值。嚴格模式旨在防止您意外保存截斷的資料。
那么如何解決你的問題呢?
一種方法是在當前會話中暫時禁用嚴格模式。
SET @sql_mode=@@sql_mode;
SET sql_mode='';
...do your UPDATE...
SET sql_mode=@sql_mode;
另一種解決方案是更明確地使用字串的整數值,而不依賴于隱式 CAST。
例子:
SELECT CONCAT(REGEXP_SUBSTR(weight, '^[[:digit:]]*'), ' г') formatted FROM t;
-----------
| formatted |
-----------
| 100 г |
| 200 г |
| 300 г |
| 400 г |
| 500 г |
-----------
5 rows in set (0.01 sec)
(注意沒有警告)
該REGEXP_SUBSTR()函式在MySQL 8.0支持。如果您使用舊版本的 MySQL,則必須對 SUBSTR() 執行某些操作,否則如我所示禁用嚴格的 sql_mode。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368587.html
下一篇:如何在sql表中查找缺失的元素
