MySQL は標準 SQL
のすべての数値データ型をサポートします。これらの型は、概数値データ型
(FLOAT
、REAL
、DOUBLE
PRECISION
) だけでなく、真数値データ型
(INTEGER
、SMALLINT
、DECIMAL
、NUMERIC
)
を含みます。キーワード
INT
は
INTEGER
の同義語で、キーワード
DEC
は
DECIMAL
の同義語です。数値型が必要とする記憶容量に関しては、項6.5. 「データ型のストレージ要件」を参照してください。
計算結果に使用される数値型は、実行される演算および演算対象の数値型によって決まります。詳細は、項7.5.1. 「算術演算子」を参照してください。
BIT
データ型はビットフィールド値を格納し、MyISAM
、MEMORY
、InnoDB
、および
NDBCLUSTER
テーブルでサポートされています。
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
属性を追加します。
整数または浮動小数点のデータ型には、追加の属性
AUTO_INCREMENT
を指定することができます。インデックスされた
AUTO_INCREMENT
カラムに
NULL
(推奨) か
0
の値を挿入すると、カラムは次のシーケンス値に設定されます。通常これは
、value
が現在テーブルの中にあるカラムの最大値である、
です。value
+1AUTO_INCREMENT
シーケンスは 1
で始まります。
浮動小数点型では、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
(非標準の拡張)
の同義語と見なされます。また、REAL_AS_FLOAT
SQL
モードが有効でないかぎり、REAL
は DOUBLE
PRECISION
(非標準の変動)
の同義語と見なされます。
最大ポータビリティのために、おおよその数値データ値のコードを必要とする格納は、精度仕様や桁数のない
FLOAT
か
DOUBLE PRECISION
を利用する必要があります。
DECIMAL
と
NUMERIC
データ型は、真数値データ値を格納するために利用されます。MySQL
では、NUMERIC
は DECIMAL
として実行されます。これらの型は、金銭データ等の正確な精度を必要とするものを格納するために利用されます。
MySQL 5.1
では、DECIMAL
値および
NUMERIC
値はバイナリ形式で格納されます。MySQL 5.0.3
バージョン以前では、それらは文字列として格納されていました。項7.14. 「高精度計算」
を参照してください。
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
は、0 と 1 で書かれた 2
進値です。たとえば、b'111'
と b'10000000'
はそれぞれ
7 と 128
を表しています。項5.1.5. 「ビットフィールド値」
を参照してください。
M
ビットよりも短い
BIT(
カラムに値を指定すると、その値の左側にゼロが埋め込まれます。たとえば、M
)b'101'
という値を BIT(6)
カラムに指定すると、実際には
b'000101'
を指定したのと同じことになります。
そのデータ型の許容範囲外の値を数値カラムに格納しようとすると、MySQL の反応はその時有効な SQL モードによって決まります。たとえば、もし制限モードが有効でない場合、MySQL は値をその範囲の適切な長さに短縮し、その結果出た値を代わりに格納します。しかし、厳密な SQL モードが有効になっている場合は、SQL 標準に従ってエラーが発生し、MySQL は範囲外の値を受け付けず、挿入は失敗します。
厳格でないモードでは、整数カラムに範囲外の値が割り当てられると、MySQL
はそのカラムデータ型の範囲の対応するエンドポイントを表す値を格納します。TINYINT
か TINYINT UNSIGNED
カラムに 256 を格納すると、MySQL はそれぞれに 127
か 255
を格納します。浮動小数点や固定小数点カラムが、指定された(またはデフォルトの)精度とスケールの暗黙範囲を超えた値を割り当てると、MySQL
はその範囲に対応する終点を表す値を格納します。
一方が UNSIGNED
型のときに 2
つの整数値の間で減算を行うと、デフォルトでは符号なしの結果が生成されます。結果が負になった場合、それは最大の整数値になります。INO_UNSIGNED_SUBTRACTION
SQL
モードが有効になっている場合、結果は負になります。
mysql>SET SQL_MODE = '';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+ | CAST(0 AS UNSIGNED) - 1 | +-------------------------+ | 18446744073709551615 | +-------------------------+ mysql>SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+ | CAST(0 AS UNSIGNED) - 1 | +-------------------------+ | -1 | +-------------------------+
そのような演算の結果を使用して
UNSIGNED
整数カラムが更新されると、結果はそのカラム型の最大値に切り落とされます。NO_UNSIGNED_SUBTRACTION
が有効になっている場合は、0
に切り落とされます。厳密な SQL
モードが有効になっている場合は、エラーが発生し、カラムは変わりません。
MySQL
が厳密モードで機能していないときの短縮によって行われた変換は、ALTER
TABLE
、LOAD
DATA
INFILE
、UPDATE
、そして複数行
INSERT
ステートメントに対しては警告としてレポートされます。MySQL
が厳密モードで機能しているときは、そのテーブルがトランザクションテーブルかそれ以外のものなのかによって、これらのステートメントは失敗となり、いくつかの、またはすべての値の挿入も変更も行われません。詳細については、Server SQL Modesをご参照ください。