Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«MySQL: руководство профСссионала». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 2

Автор АлСксСй ΠŸΠ°ΡƒΡ‚ΠΎΠ²

mysql> SET sql_mode='TRADITIONAL';


Если число вставлСно Π² столбСц Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (DECIMAL ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число), ΠΎΠ½ΠΎ вставлСно с Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Ссли находится Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° столбца.

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ†ΠΈΡ„Ρ€ Π² Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части, происходит ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрировано ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅. ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΊΠ°ΠΊ описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ " 1.4. ПовСдСниС округлСния".

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ†ΠΈΡ„Ρ€ Π² цСлочислСнной части, ΠΎΠ½ΠΎ слишком большоС ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Если строгий Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ допускаСтся, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ усСчСно ΠΊ самому Π±Π»ΠΈΠ·ΠΊΠΎΠΌΡƒ допустимому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΈ сгСнСрировано ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

Если строгий Ρ€Π΅ΠΆΠΈΠΌ допускаСтся, происходит ошибка пСрСполнСния.


По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ NULL ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ прСдупрСТдСния. Π‘ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ SQL ERROR_FOR_DIVISION_BY_ZERO MySQL ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ:


Если строгий Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ допускаСтся, происходит ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

Если строгий Ρ€Π΅ΠΆΠΈΠΌ допускаСтся, вставки ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ, Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹, ΠΈ происходит ошибка.


Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, вставки ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ошибки, Π½ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ERROR_FOR_DIVISION_BY_ZERO Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ строгому Ρ€Π΅ΠΆΠΈΠΌΡƒ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ эту ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ:


INSERT INTO t SET i = 1/0;


Π­Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ случаСтся для ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ строгого Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈ ERROR_FOR_DIVISION_BY_ZERO:


Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ sql_mode | Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚


'' (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) | Никаких ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ошибок: i установлСн Π² NULL.

strict | Никаких ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ошибок: i установлСн Π² NULL.

ERROR_FOR_DIVISION_BY_ZERO | Никаких ошибок, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: i установлСн Π² NULL.

strict,ERROR_FOR_DIVISION_BY_ZERO | Ошибка: никакая строка Π½Π΅ вставлСна.


Для вставок строк Π² числовыС столбцы, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· строки Π² число ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли строка ΠΈΠΌΠ΅Π΅Ρ‚ нСчисловоС содСрТаниС:


Π‘Ρ‚Ρ€ΠΎΠΊΠ°, которая Π½Π΅ начинаСтся с числа, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ число, ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π­Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку.

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, которая начинаСтся с числа, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π°, Π½ΠΎ конСчная нСчисловая Ρ‡Π°ΡΡ‚ΡŒ усСчСна. Если усСчСнная Ρ‡Π°ΡΡ‚ΡŒ содСрТит Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, это ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

1.4. ПовСдСниС округлСния

Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» обсуТдаСт Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ матСматичСского округлСния для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ROUND() ΠΈ для вставок Π² столбцы с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ с Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

Ѐункция ROUND() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ числом:


Для числа Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ значСния ROUND() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ "округлСния ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹": Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ .5 ΠΈΠ»ΠΈ большС ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΎ Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Ссли ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, ΠΈΠ»ΠΈ Π΄ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Ссли ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅. ЗначСния с Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ мСньшС, Ρ‡Π΅ΠΌ .5, ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Ρ‹ Π΄ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Ссли ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, ΠΈΠ»ΠΈ Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ, Ссли ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅.


Для числа ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ зависит ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C. На ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с любой Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΎ ROUND() ΠΊ самому Π±Π»ΠΈΠ·ΠΊΠΎΠΌΡƒ Ρ‡Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ†Π΅Π»ΠΎΠΌΡƒ числу.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ отличаСтся для Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:


mysql> SELECT ROUND(2.5), ROUND(25E-1);

+------------+--------------+

| ROUND(2.5) | ROUND(25E-1) |

+------------+--------------+

| 3 | 2 |

+------------+--------------+


Для вставок Π² DECIMAL ΠΈΠ»ΠΈ цСлочислСнный столбСц, Ссли адрСсат прСдставляСт собой Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ "округлСния ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹" нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ вставлСно, Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ:


mysql> CREATE TABLE t (d DECIMAL(10,0));

Query OK, 0 rows affected (0.00 sec)


mysql> INSERT INTO t VALUES(2.5),(2.5E0);

Query OK, 2 rows affected, 2 warnings (0.00 sec)

Records: 2 Duplicates: 0 Warnings: 2


mysql> SELECT d FROM t;

+------+

| d |

+------+

| 3 |

| 3 |

+------+

1.5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ матСматичСской точности

Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» обСспСчиваСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ запросы с матСматичСской Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² MySQL 5.1.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. Числа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ с ΠΈΡ… Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π°Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:


mysql> SELECT .1 + .2 = .3;

+--------------+

| .1 + .2 = .3 |

+--------------+

| 1 |

+--------------+


Для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅Ρ‚ΠΎΡ‡Π½Ρ‹:

mysql> SELECT .1E0 + .2E0 = .3E0;

+--------------------+

| .1E0 + .2E0 = .3E0 |

+--------------------+

| 0 |

+--------------------+


Π”Ρ€ΡƒΠ³ΠΎΠΉ способ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ значСния состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ малСнькоС число ΠΊ суммС ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. РассмотритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, которая добавляСт .0001 ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 1000 Ρ€Π°Π·:


CREATE PROCEDURE p ()

BEGIN

DECLARE i INT DEFAULT 0;

DECLARE d DECIMAL(10,4) DEFAULT 0;

DECLARE f FLOAT DEFAULT 0;

WHILE i < 10000 DO

SET d = d + .0001;

SET f = f + .0001E0;

SET i = i + 1;

END WHILE;

SELECT d, f;

END;


Π‘ΡƒΠΌΠΌΠ° для d ΠΈ f логичСски Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ 1, Π½ΠΎ это истинно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для дСсятичного вычислСния. ВычислСниС с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой прСдставляСт малСнькиС ошибки:

+--------+------------------+

| d | f |

+--------+------------------+

| 1.0000 | 0.99999999999991 |

+--------+------------------+


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполняСтся с ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠΌ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ стандартом SQL. Π’ΠΎ Π΅ΡΡ‚ΡŒ, для Π΄Π²ΡƒΡ… чисСл X1 ΠΈ X2, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π± S1 ΠΈ S2, ΠΌΠ°ΡΡˆΡ‚Π°Π± Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: S1+S2:


mysql> SELECT .01 * .01;

+-----------+

| .01 * .01 |

+-----------+

| 0.0001 |

+-----------+


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3. ПовСдСниС округлСния Ρ‡Π΅Ρ‚ΠΊΠΎ:

ПовСдСниС округлСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ROUND()) нСзависимо ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ основной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²Ρ‹ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ….

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ для столбцов с Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ здСсь:

mysql> SELECT ROUND(2.5), ROUND(-2.5);

+------------+-------------+

| ROUND(2.5) | ROUND(-2.5) |

+------------+-------------+

| 3 | -3 |

+------------+-------------+


Однако, ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ C, которая Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹:


mysql> SELECT ROUND(2.5E0), ROUND(-2.5E0);

+--------------+---------------+

| ROUND(2.5E0) | ROUND(-2.5E0) |

+--------------+---------------+

| 2 | -2 |

+--------------+---------------+


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4. Π’ строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅ вставка значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся слишком большим, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΈ ошибкС, Π° Π½Π΅ ΠΊ ΡƒΡΠ΅Ρ‡Π΅Π½ΠΈΡŽ Π΄ΠΎ допустимого значСния. Когда MySQL Π½Π΅ выполняСтся Π² строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅, происходит усСчСниС ΠΊ допустимому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ:


mysql> SET sql_mode='';

Query OK, 0 rows affected (0.00 sec)


mysql> CREATE TABLE t (i TINYINT);

Query OK, 0 rows affected (0.01 sec)


mysql> INSERT INTO t SET i = 128;

Query OK, 1 row affected, 1 warning (0.00 sec)


mysql> SELECT i FROM t;

+------+

| i |

+------+

| 127 |

+------+

1 row in set (0.00 sec)


Однако, условиС пСрСполнСния происходит, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ строгий Ρ€Π΅ΠΆΠΈΠΌ:


mysql> SET sql_mode='STRICT_ALL_TABLES';

Query OK, 0 rows affected (0.00 sec)


mysql> CREATE TABLE t (i TINYINT);

Query OK, 0 rows affected (0.00 sec)


mysql> INSERT INTO t SET i = 128;

ERROR 1264 (22003): Out of range value adjusted for column 'i' at row 1


mysql> SELECT i FROM t;

Empty set (0.00 sec)


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5: Π’ строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ с настройкой ERROR_FOR_DIVISION_BY_ZERO Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π° Π½Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ NULL.

Π’ нСстрогом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ NULL:


mysql> SET sql_mode='';

Query OK, 0 rows affected (0.01 sec)


mysql> CREATE TABLE t (i TINYINT);

Query OK, 0 rows affected (0.00 sec)


mysql> INSERT INTO t SET i = 1 / 0;

Query OK, 1 row affected (0.00 sec)


mysql> SELECT i FROM t;

+------+

| i |

+------+

| NULL |

+------+

1 row in set (0.03 sec)


Однако, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡƒΠ»ΡŒ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ SQL-Ρ€Π΅ΠΆΠΈΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹:


mysql> SET sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';

Query OK, 0 rows affected (0.00 sec)


mysql> CREATE TABLE t (i TINYINT);

Query OK, 0 rows affected (0.00 sec)


mysql> INSERT INTO t SET i = 1 / 0;

ERROR 1365 (22012): Division by 0


mysql> SELECT i FROM t;

Empty set (0.01 sec)


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 6. Π”ΠΎ MySQL 5.0.3 Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ с Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ с ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² значСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности:


mysql> SELECT VERSION();

+------------+

| VERSION() |

+------------+

| 4.1.18-log |

+------------+

1 row in set (0.01 sec)


mysql> CREATE TABLE t SELECT 2.5 AS a, 25E-1 AS b;

Query OK, 1 row affected (0.07 sec)