【问题标题】:mysql int being passed to python as longmysql int 被传递给 python
【发布时间】:2012-09-24 20:01:56
【问题描述】:

我有一个 mysql 数据库,我在其中定义了一个表:

CREATE TABLE IF NOT EXISTS tblModel (
model_id int NOT NULL AUTO_INCREMENT,
model_file varchar(50) NOT NULL,
model_name varchar(50) NOT NULL,
model_descrip varchar(200) NOT NULL,
target_index char(6) NOT NULL,
training_days int NOT NULL,
trading_days int NOT NULL,      
PRIMARY KEY(model_id));

奇怪的是,我注意到虽然 mysql 文档说 int 确实是 int(4),但我看到 int 字段实际上是作为 int(11) 创建的。这有点令人不安,因为我的指示似乎没有按照文档进行。

当我使用 mysqldb.database_connection.cursor 将该表查询到 python 中时,我看到 int 正在通过 longs - 这并不奇怪。

因此,我的问题是三重的(按照对我来说越来越重要的顺序):

1) 知道为什么将 int 创建为 int(11) 吗?

2) 此表中的 int 字段将包含序列号和天数 - 分配给 long 的空间几乎没有必要。我应该关心浪费的空间吗?

3) 假设我坚持使用 int(11)s(其他表有外键,打破并重新创建所有这些有点痛苦),有没有比进行显式转换更好的解决方案到 cur.fetchall() 或 cur.fetchone() 的 int 返回?

【问题讨论】:

    标签: types mysql-python


    【解决方案1】:
    1. 这是默认显示宽度,因为 int 可以在 -2147483648 到 2147483647 的范围内,因此最大显示宽度是 10 个整数和一个符号。一个 int 的存储大小是 4 个字节,不管它的值是多少。不要将“显示宽度”与存储大小混淆,因为仅当数字具有“zerofill”选项时才显示宽度,因此 int(4) zerofill 将显示 0004,而 int(6) zerofill 将显示 000004;这是最小显示宽度,因此使用 123456 的 int(4) zerofill 仍会产生 123456 而不是 1234。查看http://dev.mysql.com/doc/refman/5.5/en/numeric-type-attributes.html

    2. 空间可能会也可能不会被浪费,具体取决于架构和操作系统。在 C 中,int 必须至少为 16 位,long 至少为 32 位,但可能更大。在 64 位系统上,long 实际上可能是 long long 并且是 64 位。除非您在严重受限的系统上运行,否则可能不值得担心。这仅在内存中,因为无论 Python 对它们做什么,MySQL 都会将这些整数存储为 4 个字节。

    3. 如前所述,() 中的数字只是一个显示宽度,不会影响该列中数字的基础范围,尽管如果您在一张表上执行类似 int(4) zerofill 的操作一个外键和另一个上的 int(6) zerofill,连接可能会很奇怪,但我还没有测试过。将“zerofill”添加到 MySQL 数字会使该列自动无符号。从 MySQL 中读取这些内容时,您无需进行任何转换; int 适合 long,而 Python 将两者都存储为 C long。

    【讨论】:

    • 谢谢,我已经放弃收到这个答案了:-)!我现在对 mysql 部分有了更好的理解,并且可以接受。知道 Python 确实将 int 和 long 存储在相同数量的空间中也很有用,尽管 type() 将它们视为不同的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2021-06-01
    • 2013-07-13
    • 2018-05-01
    • 1970-01-01
    • 2020-07-24
    • 2014-06-03
    相关资源
    最近更新 更多