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 が long として渡されていることがわかります - 驚くことではありません。

したがって、私の質問は 3 つあります (重要度の高い順に):

1) int が int(11) として作成された理由は何ですか?

2) このテーブルの int フィールドには、シーケンス # と日数が保持されます。long に割り当てられたスペースは、ほとんど必要ありません。無駄なスペースを気にする必要がありますか?

3) 私が int(11) で立ち往生していると仮定すると (他のテーブルにはこれへの外部キーがあり、すべてを壊して再作成するのは少し面倒です)、 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 は 1234 ではなく 123456 を生成します。 http://dev.mysql.com/doc/refman/5.5/en/numeric-type-attributes.htmlを確認してください

  2. スペースは無駄になる場合と無駄にならない場合があり、アーキテクチャと OS によって異なります。C では、int は少なくとも 16 ビット、long は少なくとも 32 ビットでなければなりませんが、それより大きくてもかまいません。64 ビット システムでは、long は実際には long long であり、64 ビットである場合があります。非常に制限されたシステムで操作している場合を除き、おそらく心配する価値はありません。MySQL はこれらの int を Python の処理に関係なく 4 バイトとして格納するため、これはメモリ内にのみ存在します。

  3. 前述のように、() 内の数値は単なる表示幅であり、その列の数値の基になる範囲には影響しませんが、外部キーと int( 6)別のゼロフィル、結合は奇妙な動作をするかもしれませんが、私はそれをテストしていません. MySQL 番号に「zerofill」を追加すると、その列は自動的に無署名になります。MySQL からそれらを読み取るときに、何もキャストする必要はありません。int は long に収まり、Python はどちらも C の long として保存します。

于 2012-09-27T21:11:56.390 に答える