Mysql

mysql 錯誤 1265 列的數據被截斷

  • November 24, 2021

我在 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類型,它是一個字元串。根據我的經驗,可能導致數據截斷異常的兩個原因是:

  1. 數據超過類型精度
  2. 數據類型與表中的類型不一致

引用自:https://dba.stackexchange.com/questions/144616