Mysql
mysql 錯誤 1265 列的數據被截斷
我在 mysql 中創建了一個表,如下所示:
create table if not exists data (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, execute_time DATETIME NOT NULL default current_timestamp, db VARCHAR(25) NOT NULL, book varchar(6), `open` float(20,3) not null, `close` float(20,3) not null)
並且當我想將值插入此表時,它會失敗並將異常顯示為 DataError: (1265, “Data truncated for column ‘open’ at row 1”)
我要插入 open 的值是 3535929.559。我在 python 中對插入數據進行編碼,如下所示:
insertData = """INSERT INTO {table_name} (execute_time,db,book,`open`,`close`) values (%(execute_time)s,%(db)s,%(book)s,%(open)s,%(close)s)""" .format(table_name = settings["dumpTable"]["data"]) conn.cursor().executemany(insertData,data_in_dict) conn.commit()
最奇怪的是當我在 MySQL 工作台中插入相同的值時,它很順利,查詢是這樣的:
insert into data (db,book,`open`,`close`,execute_time) values ('au','book','3535929.559','1079339.851','2016-7-22');
但表中顯示的數據是:
'5', '2016-07-05 00:00:00', 'au', 'book', '3535929.500', '1079339.875'
我認為問題可能來自 python 的插入受到更多限制?那麼如何設置它的限制較少呢?任何幫助,將不勝感激!
不是解決問題,而是解決架構中的 2 個錯誤。
FLOAT(m,n)
接受十進制輸入,四捨五入到十進制的 n 位小數,然後轉換為帶有另一個舍入錯誤的二進制。FLOAT
(有或沒有 (m,n))只能保持大約 7 位精度。因此,您範例中的兩個數字在低端都會失去精度。正如您所發現的,儲存3535929.559
到 aFLOAT(20,3)
中,然後檢索它只會產生3535929.500
. 這是因為 aFLOAT
只有 24 個“有效位精度”。這兩個錯誤有兩種解決方案:
DECIMAL(m,n)
– (20,3) 仍將四捨五入到小數點後 3 位,但這對您的應用程序來說可能沒問題。但它沒有額外的二進制舍入,也沒有精度損失。DOUBLE
(沒有(m,n))——這有大約 16 位的精度,對於大多數應用程序來說已經足夠了。而且,即使十進制輸入將被四捨五入為二進制,它也太遠了,不太可能導致錯誤。尺寸…
FLOAT
(有或沒有 (m,n))佔用 4 個字節。
DOUBLE
(帶或不帶 (m,n))佔用 8 個字節。
DECIMAL(20,3)
佔用 10 個字節。縮小任何一個數字都可以節省空間。
我找到了原因,是因為我的open中的數據
data_in_dict
不是float類型,它是一個字元串。根據我的經驗,可能導致數據截斷異常的兩個原因是:
- 數據超過類型精度
- 數據類型與表中的類型不一致