Spațiul de stocare nu numere întregi în MySQL, blog-ul tarlyun

Î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 sunt utilizate numere de puncte: flotor. 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: ZECIMALă. NUMERIC.

Înainte de versiunea 5.03 a acestor tipuri sunt stocate ca un șir de caractere, utilizată este un șir de caractere pentru fiecare număr de cifre (dacă este necesar, petrece in plus un caracter pe semnul numărului ș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 impune ca apartament standard 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 MySQLDECIMAL NUMERIC și 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

CREATE TABLE de test (flotorului, b DOUBLE, c DECIMAL (6,4), d NUMERIC (6,4)) ENGINE = MyISAM; INSERT INTO testul (a, b, c, d) VALORI (0,3, 0,3, 0,3, 0,3), (0,00003, 0,00003, 0,00003, 0,00003); SELECT a, b, c, d FROM test; + ------- + ------- + -------- + -------- + | o | b | c | d | + ------- + ------- + -------- + -------- + | 0,3 | 0,3 | 0,3000 | 0,3000 | | 3e-05 | 3e-05 | 0.0000 | 0.0000 | + ------- + ------- + -------- + -------- +

bani SELECT de la testul de unde banii> 123.33 și bani <123.35; +--------+ | money | +--------+ | 123.34 | +--------+ 1 row in set (0.00 sec)

Î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 inițializarea câmp va lua forma de decimal (9,2). 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 MySQL la versiunea 5.0.3, este foarte recomandat să faceți upgrade la ceva mai proaspăt;

Publicații similare găsite.