Types 将mysql int传递给python的长度为

Types 将mysql int传递给python的长度为,types,mysql-python,Types,Mysql Python,我有一个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

我有一个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以long的形式出现——这并不奇怪

因此,我的问题有三个方面(按对我越来越重要的顺序):

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

2) 此表中的int字段将包含一个序列#,并且天数计数-分配给long的空间几乎没有必要。我应该关心浪费的空间吗

3) 假设我一直使用int(11)s(其他表中都有外键,打破并重新创建这些外键有点麻烦),有什么比显式转换cur.fetchall()或cur.fetchone()返回的int更好的解决方案吗

  • 这是默认的显示宽度,因为int可以在-2147483648到2147483647之间,所以最大显示宽度是10个整数和一个符号。int的存储大小为4字节,与它的值无关。不要将“显示宽度”与存储大小混淆,因为显示宽度仅在数字具有“zerofill”选项时才显示,因此int(4)zerofill将显示0004,int(6)zerofill将显示000004;这是一个最小显示宽度,所以使用123456的int(4)zerofill仍然会产生123456,而不是1234。退房

  • 空间可能会被浪费,也可能不会被浪费,这取决于体系结构和操作系统。在C语言中,整数必须至少为16位,长度至少为32位,但可以更大。在64位系统上,long实际上可能是long,并且是64位。除非你是在一个非常有限的系统上操作,否则可能不值得担心。这只是在内存中,因为MySQL将把这些int存储为4字节,而不管Python如何处理它们

  • 如前所述,()中的数字只是一个显示宽度,并不影响该列中数字的基本范围,尽管如果使用外键在一个表上执行int(4)zerofill操作,在另一个表上执行int(6)zerofill操作,连接可能会表现出奇怪的行为,但我没有测试它。将“zerofill”添加到MySQL编号会使该列自动取消签名。从MySQL中读取这些内容时,不需要强制转换任何内容;int适合于long,而Python将两者都存储为C long


  • 谢谢,我已经放弃了在这个问题上的回答:-)!我现在对mysql部分有了更好的理解,我也同意。了解Python实际上在相同的空间中存储int和long也是很有用的,尽管type()将它们视为不同的对象。