10bet网址
MySQL 5.6リファレンスマニュアル
下载本手册
PDF(美国Ltr)- 26.8 mb
PDF (A4)- 26.8 mb
HTML下载(TGZ)- 7.2 mb
HTML下载(Zip)- 7.2 mb


12.20.5高精度計算の例

このセクションでは,MySQL 5.6での高精度計算のクエリー結果を示すいくつかの例について説明します。これらの例は,セクション12.20.3 "式の処理"およびセクション12.20.4 "丸め動作"で説明されている原則を示しています。

例 1。数値は,可能であれば,指定されたとおりにその厳密値で使用されます。

mysql> SELECT(。1 + .2) = .3;+----------------+ |(。1+.2) = .3 | +----------------+ | 1 | +----------------+

浮動小数点値の場合,結果は不正確です。

mysql> SELECT(。1E0 + .2E0) = .3E0; +----------------------+ | (.1E0 + .2E0) = .3E0 | +----------------------+ | 0 | +----------------------+

厳密値と近似値の処理の違いを確認するための別の方法として,合計値に小さい数値を何回も加える方法があります。ある変数にを1000回加える次のストアドプロシジャを考えてみます。

CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 0;DECLARE d DECIMAL(10,4) DEFAULT 0;DECLARE f FLOAT DEFAULT 0;当i < 10000 DO SET d = d + .0001;SET f = f + .0001E0;SET i = i + 1;结束时;SELECT d, f;结束;

論理的には,dfの両方の合計値が1になるはずですが,それは10進数の計算にしか当てはまりません。浮動小数点の計算では,小さなエラが発生します。

+--------+------------------+ | d | f  | +--------+------------------+ | 1.0000 | 0.99999999999991  | +--------+------------------+

例 2。乗算は,標準SQLに必要なスケルで実行されます。つまり,スケールS1S2を持2の数値X1X2の場合,結果のスケルはS1+S2になります。

SELECT .01 * .01;+-----------+ | . 1 * . 01  | +-----------+ | 0.0001  | +-----------+

例 3。厳密値数値に対する丸め動作は,適切に定義されています。

丸め動作(たとえば,圆的()関数を使用した動作)は,ベ,スとなるcラ,ブラリの実装には依存しません。。

  • 厳密値カラム(小数と整数)および厳密値数値に対する丸めでは,四捨五入ルールが使用されます.0.5以上の小数部を持つ値は,次に示すように,0から遠いもっとも近い整数に丸められます。

    SELECT ROUND(2.5), ROUND(-2.5);+------------+-------------+ | (-2.5(2.5) |轮 ) | +------------+-------------+ | 3 | 3  | +------------+-------------+
  • 浮動小数点値に対する丸めでは,cラe eブラリが使用されます。これは,多くのシステムでは偶数丸めルルを使用します。このようなシステムでは,どのような小数部を持値も,もっとも近い偶数に丸められます。

    SELECT ROUND(2.5E0), ROUND(-2.5E0);+--------------+---------------+ | 轮(2.5 e0) | (-2.5 e0 ) | +--------------+---------------+ | 2 | 2  | +--------------+---------------+

例 4。厳密モードでは,カラムの範囲を外れている値を挿入すると,正当な値への切り捨てではなく,エラーが発生します。

MySQLが厳密モドで実行されていない場合は,正当な値への切り捨てが発生します。

设置sql_mode= ";查询OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t (i TINYINT);查询OK, 0行影响(0.01秒)mysql> INSERT INTO t SET i = 128;查询OK, 1 row affected, 1 warning (0.00 sec) mysql> SELECT i FROM t;+------+ | 我  | +------+ | 127年  | +------+ 1行集(0.00秒)

ただし,厳密モ,ドが有効になっている場合は,エラ,が発生します。

设置sql_mode='STRICT_ALL_TABLES';查询OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t (i TINYINT);查询OK, 0行影响(0.00 sec) mysql> INSERT INTO t SET i = 128;错误1264 (22003):Out of range value adjusted for column 'i' at row 1 mysql> SELECT i FROM t;空集(0.00秒)

例 5:厳密モドでERROR_FOR_DIVISION_BY_ZEROが設定されている場合は,0による除算によっての結果ではなく,エラが発生します。

非厳密モドでは,0による除算によっての結果が生成されます。

设置sql_mode= ";查询OK, 0行影响(0.01秒)mysql> CREATE TABLE t (i TINYINT);查询OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t SET i = 1 / 0;查询OK, 1 row affected (0.00 sec) mysql> SELECT i FROM t;+------+ | 我  | +------+ | 零  | +------+ 1行集(0.03秒)

ただし,適切なSQLモ,0。

mysql>设置sql_mode='STRICT_ALL_TABLES, error_for_vision_by_zero ';查询OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t (i TINYINT);查询OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t SET i = 1 / 0;错误1365(22012):除0 mysql> SELECT i FROM t;空集(0.01秒)

例 6。厳密値リテラルは,厳密値として評価されます。

MySQL 5.0.3より前は,厳密値リテラルと近似値リテラルはどちらも,倍精度浮動小数点値として評価されます。

mysql> SELECT VERSION();+------------+ | 版本 () | +------------+ | 4.1.18-log  | +------------+ 1行组(0.01秒)mysql >创建表t选择2.5,25 e 1 b;查询OK, 1 row affected (0.07 sec) Records: 1 duplicate: 0 Warnings: 0 mysql> description t;+-------+-------------+------+-----+---------+-------+ | 字段默认零关键| | | | |类型多  | +-------+-------------+------+-----+---------+-------+ | |双(3,1)| | | 0.0 | | | | b双| | | 0  | | +-------+-------------+------+-----+---------+-------+ 2行集(0.04秒)

MySQL 5.0.3の時点では,近似値リテラルは浮動小数点を使用して評価されますが,厳密値リテラルは小数として処理されます。

mysql> SELECT VERSION();+-----------------+ | 版本 () | +-----------------+ | 5.1.6-alpha-log  | +-----------------+ 1行组(0.11秒)mysql >创建表t选择2.5,25 e 1 b;查询OK, 1 row affected (0.01 sec) Records: 1 duplicate: 0 Warnings: 0 mysql> description t;+-------+-----------------------+------+-----+---------+-------+ | 字段默认零关键| | | | |类型多  | +-------+-----------------------+------+-----+---------+-------+ | |小数(2,1)无符号没有| | | 0.0 | | |不双| | | | 0  | | +-------+-----------------------+------+-----+---------+-------+ 2行集(0.01秒)

例 7。集約関数への引数が厳密値数値型である場合は,その結果も,少なくとも引数と同じスケールを持つ厳密値数値型になります。

これらのステトメントを考慮してください。

CREATE TABLE t (i INT, d DECIMAL, f FLOAT);mysql> INSERT INTO t VALUES(1,1,1);SELECT AVG(i), AVG(d), AVG(f) FROM t;

MySQL 5.0.3より前は,引数の型にかかわらず,結果が倍精度値になります。

mysql描述:+--------+--------------+------+-----+---------+-------+ | 字段默认零关键| | | | |类型多  | +--------+--------------+------+-----+---------+-------+ | AVG (i)双(17日4)| |是| |零| | | AVG (d)双(17日4)| |是| |零| | | AVG (f)双|是| | | NULL  | | +--------+--------------+------+-----+---------+-------+

MySQL 5.0.3の時点では,結果が倍精度値になるのは浮動小数点引数の場合だけです。厳密値型引数の場合は,結果も厳密値型になります。

mysql描述:+--------+---------------+------+-----+---------+-------+ | 字段默认零关键| | | | |类型多  | +--------+---------------+------+-----+---------+-------+ | AVG (i) |小数(14日,4)|是| |零| | | AVG (d) |小数(14日,4)|是| |零| | | AVG (f)双|是| | | NULL  | | +--------+---------------+------+-----+---------+-------+

結果が倍精度値になるのは浮動小数点引数の場合だけです。厳密値型引数の場合は,結果も厳密値型になります。