精密計算では、出来るだけ正確な値の数を附与して使用します。例えば、比較における数字を、値を変更しないで附与して正確に使用します。厳密なSQL モードでは、コラムの中に正確なデータタイプ(DECIMALあるいは整数)でINSERTするために、それがコラム限界内に収まる場合、数がその正確な値を使って挿入されます。複製する場合、値を挿入した時と同じにすべきです。(ストリクトモードなしで、INSERTのための切り捨てが許されています。)
数値表現の取り扱い方法は表現にどんな種類の値が含まれているかによって異なります:
近似値が存在している場合、表現は近似で、これを、浮動小数点算数を使って評価します。
近似値が存在していない場合、表現には正確な値だけを含めます。正確な値に端数部分(少数点の後に続く値)が含まれている場合、表現はDECIMAL 正確算数を使って評価されます。この場合、表現は65桁の精度を持っています。(「exact」の用語は、2進で表現できるものの限界を条件と使用しています。例えば、1.0/3.0は小数表記法で.333...と近似させることができますが、正確な数として書かれないので、(1.0/3.0)*3.0は正確に1.0であると評価しません。)
さもないと、表現に整数値だけが含まれます。表現は正確で、整数算数を使って評価され、BIGINT (64 ビット)と同じ精度を持っています。
数値表現にストリングが含まれている場合、それらはダブル精度浮動小数点の値に換えられ、その表現は近似となります。
数値コラムへの挿入はSQL モードによって影響され、sql_modeシステム変数によって制御されます。.(詳しくはSQL Modesをご確認ください。)以下の部分で、(STRICT_ALL_TABLESモード値もしくはSTRICT_TRANS_TABLESモード値によって選択された) ストリクトモード並びにERROR_FOR_DIVISION_BY_ZEROについて述べます。すべての制限をオンにするには、ストリクトモード値とERROR_FOR_DIVISION_BY_ZEROを両方共含む TRADITIONALモ-ドを簡単に使用することができます。
mysql> SET sql_mode='TRADITIONAL';
正確なタイプのコラム(DECIMALもしくは整数)に数を挿入すると、コラムの範囲に収まる場合、それは正確な値と一緒に挿入されます。
値に桁数の多い端数部分が含まれている場合には、切り捨てが起こり、警告が生成されます。切り捨ては、セクション 項5.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
|
エラー状態、 列は挿入されない。 |
ストリングを数値コラムに挿入するために行うトリングの数へ変換は、ストリングに非数値内容が含まれている場合、以下の通り処理されます:
数から始まっていないストリングは数として使用することはできません、これを使用すると、ストリクトモードの中にエラーが発生するか、警報が生成されます。これは空のストリングを含んでいます。
数で始まるストリングは変換することができますが、添付されている非数値部は切り捨てられます。切り捨て部分にスペースを除く何かが含まれている場合、これによって、ストリクトモードの中にエラーが発生するか、警報が生成されます。
