【问题标题】:MySQL provides wrong ID after Insert (datatype?)MySQL 在插入后提供了错误的 ID(数据类型?)
【发布时间】:2019-01-05 07:15:20
【问题描述】:

我有一个在 MySQL DB (10.1.26 MariaDB) 中插入记录的小 python (3.64) 脚本

import MySQLdb as mdb
...
for id in allids
  ...
  cursor.execute("INSERT IGNORE INTO entity(id,name) VALUES (%s, %s)", (identifier, name))

标识符是一个整数,如2832718610241077149,始终为 19 位。 MySQL 字段为int(25)

我使用循环插入语句,但我只选择了 1 条记录(使用 MySQL Workbench 检查)。 id 与 Python 中的标识符没有任何共同之处,类似于2157483647

我发现,当我将 DB 字段更改为 varchar(25) 时效果很好。然后可以选择循环的所有插入,并且 ID 也是正确的。但我想这不是怎么做的。

【问题讨论】:

  • 您确定您正在使用正确的方法来获取最后一个 ID?在我看来,您正在获取游标 ID,而不是 last_insert_id。
  • 是的,我在 MySQL 工作台中使用 SELECT * FROM 实体,而不是在 python 中。列 id 不显示我的 python 脚本中的标识符,并且只有一条记录(好像在第一次插入后停止了?)

标签: python mysql sqldatatypes


【解决方案1】:

在 MySQL 中,INT(25) 仅表示显示宽度,as explained here。您没有能够存储 25 位宽数字的整数类型字段,INT 字段将始终为 32 bits wide,这解释了您得到的结果 - 数字只是被切碎以适合 32 位。

如果您需要存储如此大的数字,请查看 DECIMAL or NUMERIC 类型。

另请阅读this part of the manual 以了解 MySQL 将如何处理这种情况。

【讨论】:

  • 非常感谢!而已。我将字段更改为 DECIMAL(25,0),它现在完美运行!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2012-06-04
  • 1970-01-01
  • 2012-03-17
  • 2015-01-12
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多