0

我有一个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 (其他表有外键,打破和重新创建所有这些有点痛苦),有没有比对 int 进行显式转换更好的解决方案cur.fetchall() 或 cur.fetchone() 返回?

4

1 回答 1

0
  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( 6)zerofill 在另一个上,连接可能会很奇怪,但我还没有测试过。将“zerofill”添加到 MySQL 数字会使该列自动无符号。从 MySQL 中读取这些内容时,您无需进行任何转换;int 适合 long 并且 Python 将两者都存储为 C long 无论如何。

于 2012-09-27T21:11:56.390 回答