Spațiul de stocare nu numere întregi în MySQL - Publicații

În MySQL, există mai multe tipuri de numere de stocare de date ca numere întregi și valori în virgulă mobilă.
Luați în considerare formate existente:

Pentru întreg utilizat: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT. Aceste tipuri sunt utilizate pentru a stoca și ia numere întregi de la 1 la 8 octeți de memorie, respectiv.

Pentru plutitoare numere de puncte sunt folosite: FLOAT, DOUBLE. Principalul dezavantaj al floating-point (sau numărul real) - principiul prezentării și depozitării acestora. Aceste numere sunt stocate ca o putere de două. Deoarece nu toate numerele zecimale sunt o reprezentare corectă a unei fracții binare, stocarea rezultatele sunt rotunjite. Chiar și operații matematice elementare sunt posibile discrepanțe. Mai multe detalii despre acest lucru poate fi citit pe Habré

Atunci când stocarea de date importante (de exemplu, un cont bancar) este important în fiecare simbol chiar și ultima cifră după virgulă, astfel încât utilizarea punctului imposibil plutitoare.
Evitați stocarea și regăsirea problemelor de date pot fi cu ajutorul tip: decimale NUMERIC.

Pentru versiunea 5.03, aceste tipuri stocate ca siruri de caractere, utilizat un șir de caractere pentru fiecare cifră numărul (dacă este necesar, să-și petreacă suplimentar un caracter la un semn număr și punctul zecimal) a fost, de asemenea, posibilă pierdere de precizie, datorită punerii în aplicare incorecte a aritmetice astfel numere.

Deoarece 5.03 în MySQL o nouă bibliotecă pentru aritmetice fixe numere de puncte și de abordare diferită pentru stocarea unor astfel de numere. Acum, partea integrală și o parte după virgulă sunt stocate ca două numere întregi separate. Consumul de spațiu Rata se poate baza pe tabelul de mai jos:

Calculul este foarte simplu: de exemplu, trebuie să păstrăm DECIMAL (10,2) - întreaga parte are 8 cifre și este de 4 octeți, partea care urmează după punctul - 2 cifre și ia 1 octet. Totală a depozitului va fi petrecut 5 octeți.

În versiunile anterioare ale MySQL, DECIMAL si tipuri NUMERIC se comportă diferit. SQL standard prevede că precizia NUMERIC (M, D) are exact cifre M. standard impune precizie nu mai puțin de cifre M pentru decimal (M, D), dar permite mai mult. Acest lucru înseamnă că, dacă ai vrut să păstrați numărul 1.00005 în decimal (6,4) și Numeric (6,4), apoi la 1,0000 va păstra Numerică standard si ZECIMALă poate salva 1.00005. Acest comportament pentru un număr mare de operații matematice poate da o mica eroare.

Cele mai recente versiuni ale MySQL ZECIMALă si NUMERIC, ambele tipuri au o precizie de exact cifre M.

Pentru a digera toate cele de mai sus, ia în considerare câteva exemple (Versiune server: 5.0.77 Gentoo Linux).

Crearea unui tabel de testare cu 4 câmpuri de diferite tipuri. Vom face aceleași date și a vedea cum se va comporta în MySQL

Un exemplu ilustrativ de ce nu ar trebui să încredere în datele importante un număr în virgulă mobilă. Dar nu cred că dubla - un panaceu. Flotată și DUBLU - același principiu de stocare. Ambele tipuri sunt la fel nu sunt exacte, doar inexactități DUBLE apar atunci când un număr mare de caractere.

Problemele pot apărea chiar și în cazurile mai inofensive. Să presupunem că stoca date privind soldul clientului până la cenți:

Dacă nu am convins să renunțe la flotor. pregăti pentru probleme atunci când caută.

Problema cu această căutare:

Dacă aveți este nevoie în câmpul de căutare pe Float - utilizați frontiera pentru a căuta.

Întrebarea rămâne deschisă. Pe măsură ce datele sunt stocate?
Să presupunem că sarcina noastră este de a păstra numărul cu două caractere după virgulă. Acest lucru se poate face în următoarele moduri:

1. FLOAT - cu ciocanul precizia, amintiți-vă despre problemele de a găsi și încă mai folosesc. Gama de numere stocate este foarte mare: [-3,402823466E + 38. -1,175494351E-38] 0 și [-1,175494351E 38. 3,402823466E + 38]. Acesta ocupă 4 octeți.

3. decimal (X, 2) - numărul exact cu un punct zecimal. În funcție de numărul dorit de caractere la punct, schimbarea X. De exemplu, avem nevoie pentru a stoca numărul la 10 milioane de euro. Apoi, câmpul de inițializare va avea forma decimal (9,2), un câmp - 5 octeți ocupă și de a stoca numere în intervalul [-9,999,999.99. 9999999.99].

4. INT - magazin imediat în „Penny“, și toate transformările implicate în proceduri stocate, triggere, PHP sau alt limbaj de programare. Cu această abordare, putem păstra numerele din intervalul: [-21,474,836.48. 21474836.47], sau folosind UNSIGNED [0. 42949672.95]. Dacă aveți nevoie de brusc un interval mai mare, aveți posibilitatea să utilizați întotdeauna 8-byte BIGINT.

1. Pentru stocarea datelor importante nu pot fi utilizate tipuri de flotorul și DOUBLE;

2. Cel mai bun mod de a stoca - ZECIMALă. Într-un caz extrem - INT sau BIGINT (mai ales dacă ați utilizat ORM sau DAO pentru a avea acces la date, precum și toate operațiunile pentru traducerea unei întregi fracții și înapoi va fi transparent);

4. Dacă utilizați o versiune de MySQL înainte de 5.0.3. este recomandat să faceți upgrade la ceva mai proaspăt;