高精度計算では、出来るだけ正確な値の数を附与して使用します。たとえば、比較における数字を、値を変更しないで附与して正確に使用します。厳密な
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
システム変数によって制御されます。詳細は、Server 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
または整数)
に数を挿入すると、カラムの範囲に収まる場合、それは正確な値と一緒に挿入されます。
値に桁数の多い端数部分が含まれている場合には、切り捨てが起こり、警告が生成されます。切り捨ては、節 項7.14.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
|
エラー ;行が挿入されていません。 |
数値カラムへの文字列の挿入に関しては、もし文字列が非数値内容を含んでいたら文字列から数値への変換は次のように行われます。
数で始まっていない文字列は数として使用することはできず、これを使用すると、厳密モードの中にエラーが発生するか、警報が生成されます。 これは空の文字列を含んでいます。
数で始まる文字列は変換することができますが、添付されている非数値部は切り捨てられます。切り捨て部分にスペース以外の何かが含まれている場合、これによって、厳密モードの中にエラーが発生するか、警報が生成されます。