MySQL InnoDB DECIMAL - カラム宣言または実際のデータによって駆動されるデータサイズ?

私はMySQLを使用しています。私のテーブルはすべてInnoDBエンジンを使用しています。 DECIMAL(38、0)として宣言されたいくつかのカラムがあり、それらは広範囲に使用されています。 MySQLのドキュメント( http://dev.mysql.com /doc/refman/5.5/en/storage-requirements.html )、38桁の値には17バイト(38 = 4 * 9 + 2; 4 * 4 + 1 = 17)が必要です。はい。

しかし、この列に格納されている値はすべて17バイトかかりますか?例えば、値432の場合、4バイトしか取ることはできません(私は本当にそう思っています...)、それとも17バイトをとるのでしょうか?

最後に、私はOracleで占有されているサイズが格納されている実際の値に依存していることを知っています。しかし、それはMySQLでも同様に最適化されていますか?

1
私はそれが17バイトを割り当て、同じように占有すると思う。
追加された 著者 Melvin Protacio,

2 答え

私は答えは、それはとにかく17バイトかかると思う。あなたが気付いた場合、リンクされたマニュアルページに詳細がありますが、DBMSが値がどれほど長いかを記録する手段はありません。これと比較すると、 VARCHAR(255)CHARACTER SET ascii 列の場合、値の長さ(最大サイズは256バイト)を示す値の先頭に1バイトがあります。 VARCHAR(1000)CHARACTER SET ascii 列には、長さを示す2バイトがあります。ここでは、値の長さを記録する方法は詳しく述べられていないため、列が常に最大量の領域を占めると結論づけています。

2
追加された
実際には1バイト長の場合、最大長は256ではなく 255 です。列の値はゼロの長さ
追加された 著者 Bohemian,
@ボヘミアン、私は "最大サイズの256バイト"と言うとき、私は、列が占めるスペースが最大256バイトであることを意味します:長さインジケータの1バイトと値の255バイト。
追加された 著者 Hammerite,

10進数は「固定長」なので、すべての値が17バイト必要です

1
追加された