精密計算では、出来るだけ正確な値の数を附与して使用します。例えば、比較における数字を、値を変更しないで附与して正確に使用します。厳密な
SQL モードでは、カラムの中に正確なデータ
タイプ(DECIMAL
あるいは整数)を利用してカラム内に
INSERT
する為に、もしカラム範囲内に収まる場合は、その数値が正確な値を使って挿入されます。検索された場合は、挿入した時と同じに値である必要があります。(ストリクト
モードなしで、INSERT
の為の切り捨てが許容されています。)
数値表現の取り扱い方法は表現にどんな種類の値が含まれているかによって異なります。
近似値が存在している場合、式は近似であり、これを、浮動小数点算数を使って評価します。
近似値が存在していない場合、式は正確な値だけを含みます。正確な値に端数部分(少数点の後に続く値)が含まれている場合、式は
DECIMAL
正確算数を使って評価され、式は65桁の精度を持ちます。(「exact」
という言葉は、バイナリで表現できる、物の限界を条件と使用しています。例えば、1.0/3.0
は小数表記法で .333...
と近似させる事ができますが、正確な数として書かれないので、(1.0/3.0)*3.0
は正確に 1.0
であると評価しません。)
そうでなければ、式に整数値だけが含まれます。式は正確で、整数算数を使って評価され、BIGINT
(64 ビット)と同じ精度を持っています。
数値表現に文字列が含まれている場合、それらはダブル精度浮動小数点の値に換えられ、その式は近似となります。
数値カラムへの挿入は SQL
モードによって影響され、sql_mode
システム変数によって制御されます。.(項4.2.6. 「SQL モード」
を参照してください。)以下の部分で、(STRICT_ALL_TABLES
モード値もしくは STRICT_TRANS_TABLES
モード値によって選択された) ストリクト
モード並びに ERROR_FOR_DIVISION_BY_ZERO
について述べます。すべての制約をオンにするには、ストリクト
モード値と ERROR_FOR_DIVISION_BY_ZERO
を両方共含む TRADITIONAL
モ-ドを簡単に使用する事ができます。
mysql> SET sql_mode='TRADITIONAL';
正確タイプ カラム(DECIMAL
もしくは整数)に数を挿入すると、カラムの範囲に収まる場合、それは正確な値と一緒に挿入されます。
値に桁数の多い端数部分が含まれている場合には、切り捨てが起こり、警告が生成されます。切り捨ては、セクション 項22.4. 「丸め挙動」 で述べた通りに行われます。
整数部分の桁数が多すぎ、値が大き過ぎる場合、以下の通り処理されます。
ストリクト モードが有効でない場合、値は法定値に最も近い値に切り下げられ、警告が生成されます。
ストリクト モードが有効である場合、オーバーフロー エラーが発生します。
アンダーフローは検出されないので、アンダーフローの処理は定義されていません。
デフォルトによって、ゼロでの分割は
NULL
の結果をもたらしますが、警告は生成されません。ERROR_FOR_DIVISION_BY_ZERO
を使って SQL モードを有効にすると、MySQL
はゼロでの分割を別途処理します。
ストリクト モードが有効でないと、警告が生成されます。
ストリクト モードが有効である場合、ゼロでの分割を含む挿入と更新は禁止され、エラーが発生します。
言い換えると、ゼロでの分割を実施する式を含む挿入と更新はエラーとして処理する事ができますが、これには、ストリクト
モードの他に、ERROR_FOR_DIVISION_BY_ZERO
が必要です。
我々がこのステートメントを発行すると仮定して下さい:
INSERT INTO t SET i = 1/0;
これは、ストリクト モードに
ERROR_FOR_DIVISION_BY_ZERO
モードを組み合わせると発生するものです:
sql_mode 値 |
結果 |
'' (デフォルト) |
警告・エラーなし; i は
NULL にセット。 |
ストリクト | 警告・エラーなし; i は
NULL にセット。 |
ERROR_FOR_DIVISION_BY_ZERO |
警告です。エラーがありません、 i は
NULL にセット。 |
ストリクト、ERROR_FOR_DIVISION_BY_ZERO
|
エラー ;行が挿入されていません。 |
数値カラムへの文字列の挿入に関しては、もし文字列が非数値内容を含んでいたら文字列から数値への変換は次のように行われます。
数で始まっていない文字列は数として使用する事はできず、これを使用すると、ストリクト モードの中にエラーが発生するか、警報が生成されます。これは空の文字列を含んでいます。
数で始まる文字列は変換する事ができますが、添付されている非数値部は切り捨てられます。切り捨て部分にスペース以外の何かが含まれている場合、これによって、ストリクト モードの中にエラーが発生するか、警報が生成されます。