MySQLは標準SQLの全ての数値データタイプをサポートします。これらのタイプは、概数値データタイプ(FLOAT
、REAL
、DOUBLE
PRECISION
)だけでなく、真数値データタイプ(INTEGER
、SMALLINT
、DECIMAL
、
NUMERIC
)を含みます。キーワード
INT
は INTEGER
のシノニムで、キーワード DEC
は
DECIMAL
のシノニムです。数値タイプが必要とする記憶容量に関しては、項10.5. 「データタイプが必要とする記憶容量」を参照してください。
BIT
データタイプはビットフィールド値を格納します。これは、MyISAM
、MEMORY
、
InnoDB
テーブルに対してサポートされています。
SQL標準への拡張として、MySQLは
TINYINT
、MEDIUMINT
、
BIGINT
などの整数タイプもサポートします。次のテーブルには、各整数タイプが必要とする容量と値の範囲が示されています。
タイプ | バイト | 最小値 | 最大値 |
(Signed/Unsigned) | (Signed/Unsigned) | ||
TINYINT |
1 | -128 |
127 |
0 |
255 |
||
SMALLINT |
2 | -32768 |
32767 |
0 |
65535 |
||
MEDIUMINT |
3 | -8388608 |
8388607 |
0 |
16777215 |
||
INT |
4 | -2147483648 |
2147483647 |
0 |
4294967295 |
||
BIGINT |
8 | -9223372036854775808 |
9223372036854775807 |
0 |
18446744073709551615 |
MySQLがサポートするその他の拡張として、各タイプの基本キーワードに続くカッコ内に整数データタイプの表示幅を指定するオプションがあります(例
INT(4)
)。この表示幅オプションは、カラムに指定された幅よりも小さい幅の整数値を表示する際に左側をスペースで埋めるために使用されます。
この表示幅は、カラムに格納する事ができる値の範囲も、カラムに指定された幅を超える値の表示される桁数も制限しません。例えば、SMALLINT(3)
として指定されたカラムは、通常の
-32768
から 32767
の
SMALLINT
範囲を持ち、そして、3文字で許容された範囲外の値は3文字以上の文字を使って表示されます。
オプションの拡張属性 ZEROFILL
が続いて指定された時は、デフォルトはスペースである埋め込み文字はゼロで置き換えられます。例えば、INT(5)
ZEROFILL
として宣言されたカラムには、4
の値は 00004
として表示されます。もし整数カラムの中に表示幅よりも大きい値を格納すると、MySQLが複雑なJOINに対してテンポラリテーブルを生成した時に問題が発生するという事に注意してください。これはMySQLは、データは元のカラム幅に収まると仮定するからです。
注:ZEROFILL
属性はカラムが式や UNION
クエリに含まれている時は無効になります。
全ての整数タイプは、任意の(標準ではない)
拡張子である UNSIGNED
を持つ事ができます。正数だけをコラムの中で許可し、大きい上位数値範囲が必要な時には符号無しの値を利用できます。例えば、INT
カラムが UNSIGNED
の時、カラム範囲のサイズは同じですが、その終点は
-2147483648
と 2147483647
から、0
と 4294967295
までシフトします。
浮動小数点と固定小数点も UNSIGNED
になり得ます。整数タイプと同じように、この拡張子は負の値がカラムの中に格納されるのを防ぎます。しかし整数タイプとは違い、カラム値の上限は同じままです。
数値コラムに対して ZEROFILL
を指定すると、MySQLは自動的にそのカラムに
UNSIGNED
属性を追加します。
浮動小数点タイプでは、MySQLは単精度値には4バイトを使用し、倍精度値には8バイト使用します。
FLOAT
と DOUBLE
データタイプは、近似数値データ値を表す為に利用されます。FLOAT
には、SQL基準は、括弧に囲まれたキーワード
FLOAT
に続くビットの中で精度の任意仕様
(指数の範囲ではない)
を許容します。MySQLはまた、この任意精度仕様もサポートしますが、その精度値は格納サイズを決定する為だけに使用されます。0から23の精度は、4バイトの単精度
FLOAT
カラムをもたらします。24から53の精度は、8バイトの倍精度
DOUBLE
カラムをもたらします。
MySQLは標準ではない構文を許容します。FLOAT(
、M
,D
)REAL(
またば M
,D
)DOUBLE
PRECISION(
。ここで、「M
,D
)(
」
が意味するのは、値は合計で
M
、D
)M
桁まで格納でき、そのうちの
D
桁は小数点以下である
という事です。例えば、FLOAT(7,4)
として定義されたカラムは、表示された時には
-999.9999
の様に見えます。MySQLは、値を格納する時に丸めを行いますので、FLOAT(7,4)
カラムに 999.00009
を挿入すると、おおよその結果は
999.0001
になります。
MySQLは DOUBLE
を DOUBLE
PRECISION
(標準ではない拡張子)の同義語として扱います。MySQLはまた、REAL_AS_FLOAT
SQLモードが有効でない限り REAL
を
DOUBLE PRECISION
(標準ではない変動)の同義語として扱います。
最大ポータビリティの為に、おおよその数値データ値のコードを必要とする格納は、精度仕様や桁数の無いFLOAT
か DOUBLE PRECISION
を利用する必要があります。
DECIMAL
と NUMERIC
データタイプは、真数値データ値を格納するために利用されます。MySQLでは、NUMERIC
は DECIMAL
として実行されます。これらのタイプは、金銭データ等の正確な精度を必要とする物を格納するために利用されます。
MySQL 5.1 は、DECIMAL
と
NUMERIC
値をバイナリフォーマットに格納します。MySQL
5.0.3バージョン以前では、それらは文字列として格納されていました。章 22. 精密計算を参照してください。
DECIMAL
や NUMERIC
カラムを宣言する時は、精度とスケールを指定する事ができます。(そして実際に通常は指定しています。)
次がその例です。
salary DECIMAL(5,2)
この例の中では、5
は精度で、2
がスケールです。精度は、その値に格納された有効な桁数を表し、スケールは小数点以下に格納できる桁数を表しています。もしスケールが0なら、DECIMAL
と NUMERIC
値は小数点と、小数点以下の数字を持ちません。
標準SQLでは、salary
カラムは5桁で、かつ小数点以下2桁の値を格納する必要があります。それ故この場合、salary
カラムに格納できる値の範囲は、-999.99
から 999.99
です。
標準SQLでは、構文
DECIMAL(
は、M
)DECIMAL(
に相当します。同じように、構文
M
,0)DECIMAL
は、DECIMAL(
に相当し、その M
,0)M
の値はインプリメンテーションが決定する事ができます。MySQLは、この両方の
DECIMAL
と NUMERIC
構文の改良形をサポートします。M
のデフォルト値は10です。
DECIMAL
や NUMERIC
の最大桁数は65ですが、DECIMAL
や
NUMERIC
カラムの実際の範囲はカラムの精度やスケールに制約される事があります。そのようなカラムが、指定スケールで許容されている小数点以下の桁数よりも多い桁数の値を指定した場合、その値はそのスケールに変換されます。(厳密には、OS特有の機能をするのですが、通常その結果は許容桁数の切捨てになります。)
BIT
データタイプは、ビットフィールド値を格納するのに利用されます。BIT(
のタイプは、M
)M
ビット値の格納を許容します。M
の範囲は1から64までが可能です。
ビット値を指定するには、b'
表記を利用する事ができます。value
'value
はゼロと1で書かれたバイナリ値です。例えば、b'111'
と b'10000000'
は、それぞれ7と128を表しています。項8.1.5. 「ビットフィールド値」を参照してください。
M
ビットよりも短い
BIT(
カラムに値を指定すると、その値の左側にゼロが埋め込まれます。例えば、M
)BIT(6)
カラムに b'101'
の値を指定すると、実際には
b'000101'
を指定した事と同じ意味になるのです。
そのデータタイプの許容範囲外の値を数値カラムに格納しようとすると、MySQLの反応はその時有効なSQLモードによって決まります。例えば、もし制限モードが有効でない場合、MySQLは値をその範囲の適切な長さに短縮し、その結果出た値を代わりに格納します。しかし、もしモードが
TRADITIONAL
に設定されていると、SQLスタンダードに従いエラーが発生し、MySQLは範囲外の値を受け付けず、挿入は失敗します。
非ストリクトモードで整数カラムに範囲外の値が指定された時、MySQLはそのカラムデータタイプの範囲に相当する終点の値を格納します。TINYINT
か TINYINT UNSIGNED
カラムに256を格納すると、MySQLはそれぞれに127か255を格納します。浮動小数点や固定小数点カラムが、指定された(またはデフォルトの)精度とスケールの暗黙範囲を超えた値を割り当てると、MySQLはその範囲に対応する終点を表す値を格納します。
MySQLがストリクトモードで機能していない時の短縮によって行われた変換は、ALTER
TABLE
、LOAD DATA
INFILE
、UPDATE
、そして複数行
INSERT
ステートメントに対しては警告としてレポートされます。MySQLがストリクトモードで機能している時は、そのテーブルがトランザクションテーブルかそれ以外の物なのかによって、これらのステートメントは失敗となり、いくつかの、または全ての値の挿入も変更も行われません。詳細に関しては
項4.2.6. 「SQL モード」 を参照して下さい。