MySQLの数値型(int、tinyint、bigint、decimal、number、float)の解説
2019/02/24
MySQLの数値型(int、tinyint、bigint、decimal、number、float)のまとめ
MySQLでテーブル設計をする際、数値型の設定についてよく調べることがあるので、それをまとめて記事にしてみることにしました。
MySQLの数値型は整数型、固定小数点型、浮動小数点型の 3種類
MySQLの「数値型」には、大きく分けて下記の 3種類があります。
- 整数型
- 固定小数点型
- 浮動小数点型
「整数型」には、以下の型があります。
TINYINT、SMALLINT、MEDIUMINT、INTEGER(INT)、BIGINT
「固定小数点型」には、以下の型があります。
DECIMAL、NUMERIC
「浮動小数点型」には、以下の型があります。
FLOAT、DOUBLE
それぞれについて詳しく解説をしていきます。
「整数型」は TINYINT、SMALLINT、MEDIUMINT、INTEGER(INT)、BIGINT
「整数型」には、TINYINT、SMALLINT、MEDIUMINT、INTEGER(INT)、BIGINTの型があります。
「整数型」というように、TINYINT、SMALLINT、MEDIUMINT、INTEGER(INT)、BIGINTには整数のみ保存することができます。
小数点がある数値を保存したい場合は、「固定小数点型」もしくは「浮動小数点型」を使用します。
TINYINT、SMALLINT、MEDIUMINT、INTEGER(INT)、BIGINTの型の違いは、保存することができる数値の範囲(桁数)の違いです。
また、ストレージを使用するバイト数(大きさ)の違いでもあります。
大きさは、TINYINT、SMALLINT、MEDIUMINT、INTEGER(INT)、BIGINTの順番で大きくなります。
また、「数値型」の各型が持つ値は、デフォルトでは 0を中心にプラス値とマイナス値を持ちます。
ですが、マイナスの数値が必要ない場合は、プラスの数値だけにすることもできます。その分持てる範囲が広がります。
TINYINT
バイト数:1バイト
標準桁数:tinyint(4)
符号付きの時の範囲:-128 ~ 127
符号なしの時の範囲: 0 ~ 255
SMALLINT
バイト数:2バイト
標準桁数:smallint(6)
符号付きの時の範囲: -32,768 ~ 32,767
符号なしの時の範囲: 0 ~ 65,535
MEDIUMINT
バイト数:3バイト
標準桁数:mediumint(9)
符号付きの時の範囲:-8,388,608 ~ 8,388,607
符号なしの時の範囲: 0 ~ 16,777,215
INTEGER(INT)
バイト数:4バイト
標準桁数:int(11)
符号付きの時の範囲:-2,147,483,648 ~ 2,147,483,647
符号なしの時の範囲: 0 ~ 4,294,967,295
※「INTEGER」は「INT」の別名で、どちらを記述しても同一の動きをします。
BIGINT
バイト数:8バイト
標準桁数:bigint(20)
符号付きの時の範囲:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
符号なしの時の範囲: 0 ~ 18,446,744,073,709,551,615
「整数型」で一番よくつかわれる型は「int」です。
整数型でどれを使うか迷ったときは「int」を指定しておけばいいんじゃないでしょうか。
また、「標準桁数」として記述した、「int」の場合は「int(11)」の表記ですが、create文で「int」を指定すると、標準で「int(11)」として設定される桁数を示しています。
この「int(11)」は、型を何桁の数値として表示するか、を表すものです。
「int(11)」とは、11桁で表示する、という意味です。
保存されている数値の桁数が 2桁の場合は、「スペース 9桁」+「数値 2桁」として表示されます。
ここで注意が必要な点は、「int(6)」などのように設定しても、「int」が確保するストレージのサイズや、保存される値は 6桁にはならない、という点です。
あくまでも、表示する際の桁数を指定するものである、という点の理解が必要です。
そのため、「int(100)」という設定も可能ですが、保存される値に差異はありません。
また、「int(11)」の表記は、標準 SQLには存在しない、MySQL独自の記述方法です。
UNSIGNEDでプラス値だけに制限する
先に説明したように、整数型はデフォルトでは 0を中心にマイナスからプラスの値を取ります。
「TINYINT」の場合は、デフォルト設定で取りうる範囲は 0を中心とした「-128 ~ 127」ですが、「UNSIGNED(符号なし)」を設定したときの範囲は 0から始まる「0 ~ 255」になります。
「UNSIGNED(符号なし)」を設定すると、マイナスの範囲(-128 ~ -1)がプラスに移動しますので、「128 ~ 255」の範囲が使えるようになります。
具体的には下記の様に「UNSIGNED」を指定します。
1 |
int unsigned |
プラスの値だけしか取れなくなりますので、マイナスの値を INSERTしようとするとエラーになります。
ZEROFILLで 0埋めする
smallintは 5桁ですが、3桁の数字を入力した場合、残りの 2桁の部分にはスペースが入っています。
これに対して、ZEROFILLを指定すると、0埋めが実施されます。
1 2 3 4 5 |
標準 123 ZEROFILLを指定 00123 |
指定の仕方は、「ZEROFILL」を記述するだけです。
1 |
int zerofill |
ちなみに「UNSIGNED」と「ZEROFILL」の両方を指定する場合は、下記の様に並べて指定します。
1 |
int unsigned zerofill |
ただし、「ZEROFILL」を指定した場合は、マイナスの値を保持することができなくなり、自動的に「UNSIGNED」が指定したことになります。
ちなみに、「tinyint(1)」を設定すると、その項目は CakePHPでは Boolean型として処理します。詳しくは下記を参照してください。
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQLの「tinyint(1)」の悲劇 Boolean型になるとは...
「固定小数点型」は DECIMAL、NUMERIC
「固定小数点型」には、DECIMAL、NUMERICの型があります。
MySQLでは、NUMERICは DECIMALの別名ですので、NUMERICと DECIMALのどちらを使ってもいいのですが、MySQLでは DECIMALを使うことが好まれるようです。
また、DECIMALの省略表記として DECを使うこともできます。
「DECIMAL」は、「固定小数点型」と言われる数値型で、小数点以下を必要とする場合に使用します。
「固定小数点型」の「DECIMAL」の指定の仕方
「固定小数点型」の「DECIMAL」は、下記の様に指定します。
1 |
DECIMAL ( トータルの桁数, 小数点以下の桁数 ) |
具体的には、トータルで 10桁、小数点以下が 2桁の場合は、下記の様にしていします。
1 |
DECIMAL ( 5, 2 ) |
この場合、トータルで 5桁ですが、小数点以下が 2桁ですので、整数部分は 3桁になります。
具体的には「-999.99~999.99」が扱える範囲になります。
「整数部分が 5桁、小数部分が 2桁」ではありませんので注意が必要です。
1 |
DECIMAL ( 10 ) |
のように、小数点以下を指定しない場合は、「DECIMAL ( 10, 0 )」として扱われ、小数点以下はないものとして扱われます。
1 |
DECIMAL |
のように、トータルの桁数も指定しない場合は、デフォルトの 10桁として「DECIMAL ( 10, 0 )」が設定されたものとして処理されます。
ちなみに、DECIMAL型の最大桁数は 65桁で、小数点以下は 30桁までです。
実際のシステムではここまで大きな桁数を扱うことはないと思いますが...
DECIMALでも UNSIGNED、ZEROFILLを設定することができる
DECIMALも INTと同じように、UNSIGNED、ZEROFILLを設定することができます。
設定の仕方も INTと同じです。
1 |
decimal unsigned |
「浮動小数点型」は FLOAT、DOUBLE、REAL
「浮動小数点型」には、FLOAT、DOUBLE、REALの型があります。
「FLOAT」「DOUBLE」「REAL」は、「浮動小数点型」と言われる数値型で、小数点以下を必要とする場合に使用します。
(「REAL」は「DOUBLE」の別名ですので、ひとまとめに解説します。)
「浮動小数点型」の「FLOAT」「DOUBLE」は、下記の様に指定します。
1 2 |
FLOAT ( トータルの桁数, 小数点以下の桁数 ) DOUBLE ( トータルの桁数, 小数点以下の桁数 ) |
桁数の指定の仕方は、「固定小数点型」の「DECIMAL」と全く同じです。
そのため、注意点も同じですので割愛します。「DECIMAL」の注意点を読んでください。
FLOAT、DOUBLEも UNSIGNED、ZEROFILLを設定することができる
FLOAT、DOUBLEも INTと同じように、UNSIGNED、ZEROFILLを設定することができます。
設定の仕方も INTと同じです。
1 2 |
float unsigned double unsigned |
「FLOAT」と「DOUBLE」との違い
浮動小数点型の「FLOAT」と「DOUBLE」の違いは、使用するストレージのサイズと小数点以下の計算精度の違いです。
必要なストレージは、FLOATが 4バイトで、DOUBLEが 8バイトです。
また、正確な桁数は、FLOATは小数点以下 7桁までで、DOUBLEは小数点以下 14桁までです。
つまり、「DOUBLE」は「倍精度」と呼ばれる精度で、「FLOAT」の「単精度」の倍の精度で計算しています。
また、MySQLは全ての計算が「倍精度」で行われていますので、「FLOAT」を選択すると予想外の誤差が発生する場合があります。
明確な意図がなければ「DOUBLE」を使用しましょう。
MySQLの FLOAT型の問題に関しては、下記の記事が参考になるかと思います。
https://hnw.hatenablog.com/entry/20171221
「固定小数点型」の「DECIMAL」と「浮動小数点型」の「DOUBLE」の違い
小数点以下を扱う数値型には「固定小数点型」の「DECIMAL」と「浮動小数点型」の「DOUBLE」とがあります。
データベースに保存される値は、「DECIMAL」と「DOUBLE」は同じように処理されますが、Webサイトの構築で使う場合は「DECIMAL」を使っておく方が無難です。
「DOUBLE」は、高速で処理されることと計算の精度が保障されていることで、小数点以下がある数値を大量に演算するような科学技術計算のシステムを構築する場合には有効だとされています。
ですが、「DECIMAL」は、誤差が発生しないため、ECサイトなどの誤差が発生しては困る Webサイトを構築する場合に使用します。
そのため、「DOUBLE」がどういうメリットがあるか、それを理解するまでは「DECIMAL」を使っておけばいいのではないか、と思います。
ちなみに、「DECIMAL」と「DOUBLE」の項目に「1.95」「1.5」「1.49」を保存したのち、下記の SQL文を実行してみましたが、結果は「DECIMAL」と「DOUBLE」の違いはありませんでした。(結果は、2、2、1でした。)
1 2 |
select id, cast(decimal as signed), cast(double as signed) from test; select id, convert(decimal, signed), convert(double, signed) from test; |
参考サイト
11.2.1 整数型 (真数値) – INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT
https://dev.mysql.com/doc/refman/5.6/ja/integer-types.html
11.2.2 固定小数点型 (真数値) – DECIMAL、NUMERIC
https://dev.mysql.com/doc/refman/5.6/ja/fixed-point-types.html
11.2.3 浮動小数点型 (概数値) – FLOAT、DOUBLE
https://dev.mysql.com/doc/refman/5.6/ja/floating-point-types.html
11.7 データ型のストレージ要件
https://dev.mysql.com/doc/refman/5.6/ja/storage-requirements.html
MySQL Integer, Float & Decimal Data Types Differences
https://code.rohitink.com/2013/06/12/mysql-integer-float-decimal-data-types-differences/
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
Insert On Duplicate Key Update構文の使い方
レコードの有無で Insert、Updateを切り替える On Duplicate Key構文の使い方の説明です。
-
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。
-
別サーバの MySQLにアクセスする設定・ファイアウォール設定、ポート設定、MySQL設定、テーブルへ権限付与の方法
外部サーバからアクセス方法解説。GRANTで権限付与。my.cnfのbind-addressで制限解除。3306ポートの開放、ファイアウォールの制限解除。確認方法と設定方法を詳細解説。
-
MySQLの「tinyint(1)」の悲劇 Boolean型になるとは...
MySQLで tinyint(1)を指定すると Boolean型を指定したことになります。意外な誤解があります。
-
MySQLの設定ファイル my.cnfがある場所と読み込み順序
MySQLの設定はmy.cnfファイルに記述されています。my.cnfを設置する場所は複数あり予め決められた順番で読み込み、その順番通りに設定内容が反映されます。
-
MySQLで SQLSTATE[42000] Row size too large(> 8126)のエラーが出たときの対処方法
MySQLで入力する文字数が多い場合「SQLSTATE[42000] Row size too large(> 8126)」のエラーが発生することがある。その対処方法の解説を解説。
-
MySQLのInnoDBでUniqueキーは最大767バイト
MySQLの Uniqueキーには InnoDBでは 767バイト、MyISAMでは 1000バイトの最大サイズの制限があります。
-
MySQLのタイムゾーン(mysql_tzinfo_to_sql)の設定方法・XAMPP環境の解説も
MySQLのタイムゾーンテーブル(mysql.time_zone)の中身を確認し、からの場合は追加する方法を解説。LinuxとWindows・XAMPPとで異なる対応方法についてそれぞれ解説。
Comment
mediumintとintのバイト数が逆になっていませんか
aさん、ご指摘ありがとうございます。
間違えていますね。
すぐに修正させていただきます。