Tipuri de date, interbase, articole, programare - programare c, delphi, c #

Deși tipurile de date sunt descrise în detaliu în documentație (vezi [1, Capitolul 4]), este necesar să se ia în considerare un număr de concepte care vor fi adesea folosite în capitolele ulterioare ale cărții. Pe lângă prezentarea informațiilor generale, vor fi luate în considerare și exemple de utilizare a tipurilor de date în bazele de date InterBase și vor fi furnizate recomandări pentru utilizarea și transformarea acestora. De asemenea, să examinăm mai atent diferențele dintre tipurile de date existente în dialectele 1 și 3 ale bazei de date InterBase.

Tipurile de date sunt elementele de bază ale oricărui limbaj de programare sau ale oricărui server DBMS, iar InterBase nu face excepție. Când spunem că unele informații sunt stocate în baza de date, trebuie să ne dăm întotdeauna în mod clar că această informație nu poate fi încărcată într-o grămadă mare; dimpotrivă, datele ar trebui sortate și sortate după "rafturi". Tipurile de date determină ce poate fi pus pe "raftul" adecvat și care nu este. Prin „rafturi“ se referă în primul rând tabele în domeniul bazei de date (a se vedea cap. „Tabele. Chei primare și generatoare“ (h. 1)), precum și variabile în cadrul declanșatoare, stocate proceduri, și așa mai departe. D.
Fiecare tip de date are un set de operațiuni care pot fi efectuate pe valori de acest tip, deci trebuie să selectați tipul corect de date la proiectarea bazei de date, ceea ce va ajuta la evitarea multor probleme atunci când dezvoltați programe client.
În InterBase, există 12 tipuri de date care pot satisface aproape orice nevoie de dezvoltator pentru stocarea datelor. Aceste tipuri sunt împărțite condiționat în următoarele 6 grupuri:

  • pentru stocarea numerelor întregi - INTEGER și SMALLINT;
  • pentru stocarea numerelor reale - FLOAT și DOUBLE PRECISION;
  • pentru numerele cu acuratețe fixă ​​- NUMERIC și DECIMAL;
  • Pentru a stoca data, ora și data / ora - DATE, TIME și TIMESTAMP;
  • pentru memorarea simbolurilor - CHARACTER (abreviere CHAR) și VARYING CHARACTER (VARCHAR);
  • Pentru a stoca date extinse dinamic - BLOB.

De asemenea, este posibil să se definească matrice de valori ale tipurilor elementare, adică toate tipurile enumerate, cu excepția BLOB.
Majoritatea tipurilor de date InterBase corespund tipurilor definite în standardul SQL92, dar, în plus, există și propriile "stafide" - matrice de tipuri de date elementare și BLOB-uri.
Arramentele din InterBase pot conține o mulțime de date dintr-un singur tip într-un singur câmp, de exemplu, puteți defini o serie de valori de tip INTEGER. Mai mult decât atât, matricele pot avea mai multe dimensiuni!
Tipul de date BLOB este un tip de date dinamic extensibil, al cărui nume este adesea descifrat ca obiect binar mare. Trebuie să spun că BLOB este o invenție a dezvoltatorilor InterBase, care mai târziu sa răspândit la toate serverele SQL moderne.

Sintaxă pentru definirea tipurilor de date

Tipurile de date sunt utilizate pentru a descrie câmpurile din tabele, variabilele în declanșatoare și procedurile stocate. Următoarea este o sintaxă generală pentru definirea tuturor tipurilor de date posibile în InterBase.

Detalii privind proprietățile tipurilor de date, cum ar fi dimensiunea, precizia și intervalul de valori posibile, sunt descrise în tabelul. 4.1 în [1], deci nu vom repeta aici. Apoi, analizăm pe scurt principalele caracteristici ale tipurilor de date și ne concentrăm asupra posibilității lor de aplicare.

Tipurile întregi sunt SMALLINT și INTEGER. Trebuie remarcat faptul că SMALLINT este o versiune trunchiată a INTEGER și are o lungime de 2 octeți, spre deosebire de 4 octeți alocați pentru stocarea INTEGER. În mod normal, nu ar trebui să economisiți pe spațiu pe disc și, prin urmare, recomandarea generală este să utilizați INTEGER pentru a stoca valorile întregului.
Sfera de aplicare a tipurilor întregi este evidentă: este necesară pentru câmpurile care conțin doar numere întregi - pentru stocarea contoarelor, cantităților etc. De obicei, tipul INTEGER are și câmpuri care conțin chei primare.

Tipuri de date reale

Tipurile reale (denumite, de asemenea, tip float) sunt FLOAT și DOUBLE PRECISION. De îndată este necesar să se avertizeze cititorul de la utilizarea tip FLOAT - precizia sa este insuficientă pentru a stoca cele mai multe valori fracționare. Mai ales nu se recomandă stocarea valorilor monetare în ea - în variabilele de tip FLOAT erorile de rotunjire cresc foarte repede, ceea ce poate surprinde puternic contabilul la rezumare.
Dacă baza de date ar trebui să stocheze numere cu puncte variabile (de exemplu, în sistemele contabile sau în sistemele de contabilitate științifică), atunci tipul DOUBLE PRECISION este cea mai bună alegere.

Trebuie menționat faptul că în dialectul 3 al InterBase pentru stocarea valorilor monetare există un mecanism pentru stocarea tipurilor cu un punct fix de lungime de 64 de biți. Utilizarea acestor tipuri oferă cea mai bună precizie.

Puncte fixe de date

Aceste tipuri de date includ NUMERIC și DECIMAL. De multe ori întrebarea este cum NUMERIC diferă de DECIMAL. Ambele tipuri au aceeași capacitate numerică - de la 1 la 18 caractere, aceeași precizie - de la zero la cifră.

Amintiți-vă că cifra este numărul total de cifre dintr-un număr, iar precizia este numărul de zecimale

Cel mai amuzant lucru este asta. în ciuda faptului că documentația spune că aceste tipuri diferă în capacitatea maximă de biți, de fapt ele sunt realizate aproape în același mod și nu există nici o diferență între ele! Puteți verifica cu ușurință acest lucru executând utilitarul isql și efectuând următoarea secvență de acțiuni.
Creați următorul tabel:

SQL> CREATE TABLE test (
CON> Num_field NUMERIC (15,2),
CON> Dec_field DECIMAL (15.2));

Apoi dăm comanda pentru a arăta structura mesei:

SQL> test tabele;

Și observăm o astfel de imagine:

NUM_FIELD NUMERIC (15, 2) Nullabil
DEC_FIELD NUMERIC (15, 2) Nullabil

După cum puteți vedea. InterBase raportează asta. că ambele aceste coloane sunt de tip NUMERIC!
Motivele acestui comportament constau în implementarea tipurilor de date cu un punct fix. Problema este că InterBase are doar 3 mecanisme de stocare a oricărei expresii întregi și toate tipurile, cu toate acestea sunt numite, sunt conduse la aceste opțiuni de implementare.
Aici este un tabel din [1], care ilustrează modul în care sunt stocate diferite tipuri de întregi (Tabelul 1.1). După cum puteți vedea, stocarea datelor în dialectul 3 diferă pentru numerele cu un bit mare:
Tabelul 1.1. Stocarea numerelor cu puncte fixe

Deci, acum putem spune diferențele dintre tipurile Numeric și ZECIMALă: în cazul determinării câmpului (variabilă) cu o adâncime mică (până la patru), primul stocat ca un număr întreg SMALLINT 2 octet, iar al doilea - în formă de INTREG 4 octeți.
Astfel, în cazul unei cifre mai mari de patru, tipurile DECIMAL și NUMERIC vor fi absolut echivalente!
Fiți atenți la diferența de implementare a tipurilor cu profunzime mare în dialectele 1 și 3. În primul dialect, numărul cu un punct fix a fost transformat dintr-un întreg într-unul real, la care s-au aplicat mecanismele de rotunjire! În al 3-lea dialectul Această ciudățenie a fost eliminat - numere întregi mari, de fapt stocate ca numere întregi - Int64 folosind un mecanism care poate stoca numere pe 64 de biți într-un interval de +/- 2 A 32. Prin urmare, datele stocate pe numerar recomandate în baze de date, create cu ajutorul dialectului 3 - numai prin utilizarea mecanismului INT64 poate garanta siguranța soldurilor monetare mici.

Tipuri pentru stocarea datei și a orei

Tipurile de data și ora de depozitare s-au schimbat în versiunea InterBase 6.x și clonele sale în comparație cu 4.x și 5.x. Pentru a evita confuzia în labirintul istorice ale acestor tipuri, ia în considerare situația este în versiunea a 6-a InterBase, și apoi se bazează pe această scurtă referire la ceea ce a fost înainte - este pentru acei utilizatori care sunt încă rulează pe versiuni mai vechi de Interbase
Deci, în InterBase 6.x există 3 tipuri de stocare a datei și orei: DATE, TIME și TGME8TAM.

Cum să lucrezi cu datele? Când vine vorba de a lucra la nivelul serverului în declanșatoare sau proceduri stocate, atunci totul este destul de simplu - putem declara întotdeauna o variabilă de tipul necesar și pentru ai acorda o valoare dintr-un tabel și vice-versa. Cu toate acestea, trebuie să transferați datele din baza de date a aplicației și din spate. În acest caz, există două abordări - fie să utilizeze bibliotecile care utilizează formatul original data Interbase pentru accesul la obiectele de tipuri și de a converti acest format în obișnuitul intralingual tip data / ora (un exemplu al unei astfel de bibliotecă este FIBPlus), sau de a folosi o dată mecanism de conversie în rânduri, built-in InterBase.
Ce se întâmplă dacă trebuie să tăiați data completă doar un an sau o lună? Pentru a face acest lucru, utilizați funcțiile de grup EXTRACT (disponibile în toate clonele InterBase 6.x), care vă permit să selectați din dată doar partea dreaptă. Aceste funcții se utilizează după cum urmează:

EXTRACT (LUNĂ DE DATE_FIELD)
EXTRACT (ANUL DE DATE_FIELD)

Lista completă a parametrilor din funcția EXTRACT este ANUL, LUNĂ, ZI, ORE, MINUTĂ, A DOUA, ZIUA DE ZI, ÎN ANUL. Desemnarea lor rezultă în mod evident din numele lor, prin urmare nu vom da aici decodificarea.

Tipuri de date pentru stocarea textului

În InterBase există două tipuri destinate stocării informațiilor textuale - CHAR și VARCHAR. numele lor complet, - CARACTERULUI și CARACTER VARIATE, dar nu există nici un motiv de a utiliza nume lungi - chiar echipa arată în tabelele de utilitate isql oferă tipuri de nume scurte.
Pentru a determina câmpul sau tipul de caracter variabil trebuie să fie în paranteze după numele tipului sau specificați numărul de caractere care vor fi utilizate într-o instalație desemnată sau reduce numărul de caractere - în acest caz, ar crea un câmp cu o lungime de 1 simbol.

CREATE TABLE testCHARLen (
Fieldl CHAR (255),
Field2 CHAR);

Ca rezultat al creării acestui tabel, câmpul Fieldl va avea o lungime de 255 de caractere, iar câmpul 2 va avea un caracter.
Tipurile CHAR și VARCHAR sunt similare în multe privințe - ambele pot conține până la 32768 de caractere, dar există diferențe. Deși aceste două tipuri sunt stocate în baza de date în același mod, InterBase lucrează cu ele în diferite moduri. Acest lucru poate fi demonstrat prin următorul exemplu:

SQL> a crea tabelul testCHAR (cl char (10), c2 varchar (10));
SQL> inserați în valorile testCHAR (cl, c2) ('Test', 'Test');
SQL> SELECT "

Ca rezultat, obținem următorul rezultat:

CREATE TABLE TestCHARSET (
Fieldl VARCHAR (255),
Field2 VARCHAR (255) set de caractere winl251);

Tip de date BLOB

CREATE TABLE testBLOB (
myBlobField BLOB);

Ca rezultat, se va crea campul myBlobField, în care puteți stoca date mari. Dar, în ciuda faptului că domeniul BLOB prin metoda de determinare nu diferă de cealaltă, punerea în aplicare a acestora în baza de date este semnificativ diferit. El-BLOB-câmpuri sunt dispuse pe o pagină de date (vezi cap. „Structura bazei de date Interbase“ (h. 4)), adiacente unul la celălalt, și în pagina de date BLOB caz sunt stocate numai ID BLOB și se BLOB este situat într-o pagină specială. Este această organizație de date care vă permite să stocați date de dimensiune nefixată.
La o pată de cerneală, este posibil să se definească un set de mai multe subtipuri și proceduri speciale, numite filtre (filtre BLOB), pentru a lucra cu aceste subtipuri. Există mai multe subtipuri BLOB predefinite care sunt construite în InterBase. Toate aceste subtipuri nu sunt negative, de exemplu subtip 0 - este tipul de date nedeterminat, subtip 1 - text, subtip 2 - BLR (Reprezentarea binară Limba, consultați Glosarul și capitolul „Structura bazei de date Interbase“.) Etc. Utilizatorul poate, de asemenea, .. definesc propriile subtipuri BLOB, care pot avea valori negative. Fiecare tip poate fi mapat la un filtru care convertește acest domeniu subtip într-un alt subtip.
Trebuie remarcat faptul că utilizarea câmpurilor BLOB servește, de obicei, ca o alternativă la stocarea fișierelor din afara bazei de date. În ceea ce privește filtrele BLOB, ele sunt folosite destul de rar datorită orientării lor către o clasă îngustă de sarcini.

DBMS InterBase a fost unul dintre primele în care au apărut matrice. Suportul pentru rețelele din baza de date este o extensie a modelului relațional tradițional. Prezența matricelor ușurează lucrul cu seturi de date de același tip.
O matrice este o colecție de valori de același tip care are un nume comun și vă permite să accesați orice element al matricei prin numărul său. Arrays în InterBase pot fi unidimensionale și multidimensionale.
Pentru a crea o serie de numere INTEGER în tabel, trebuie să scrieți ceva asemănător:

CREATE TABLE test (
myOneDimArray INTEGER [12],
myTwoDimArray INTEGER [5,4],
myThreeDimArray INTEGER [2,10,8]);

Când va fi creat acest câmp tip matrice 3: câmp myOneDimArray care conține o matrice de 12-dimensional de numere, lungime myTwoDimArray cuprinzând un bi-dimensional matrice (matrice) numere 5x4 câmp Integer și myThreeDimArray - dimensional matrice 2x10x8. Trebuie remarcat faptul că, cu această definiție a elementelor de matrice sunt numerotate începând cu unul, adică, primul element este numerotată 1, al doilea - .. No. 2, etc. Dacă cineva dorește să specifice limitele matrice în mod independent, de exemplu de la 0 la 5, atunci .. trebuie să specificați definiția câmpului după cum urmează:

Matricele sunt puse în aplicare pe baza unui câmp BLOB, astfel încât să nu ar trebui să se teamă că o matrice multidimensionale „poluează“ tabelul cu o cantitate incredibila de date: Interbase plasează ușor datele de matrice ca pagini individuale, pentru a optimiza operarea IO în aceste domenii.
Cum se utilizează matricele? Acestea oferă un mecanism convenabil pentru stocarea obiectelor similare. Cu toate acestea, în 80% din cazuri, în loc de dezvoltatori matrici preferă să păstreze subordonat de date multiple (detaliu) tabele, astfel încât matrice nu sunt atât de des utilizate în aplicații de baze de date client Interbase. Aceasta ajută foarte mult, care vin cu Delphi și C ++ Builder pentru a avea acces la bibliotecă, cum ar fi BDE și GWH, nu au posibilitatea de a lucra cu matrice. Documentația pentru Interbase se referă la capacitatea de a lucra cu fișiere folosind gpre Preprocessor, dar acest lucru nu este modul cel mai convenabil pentru Delphi / C-H-Builder. Din fericire, biblioteca FIBPlus are suport pentru câmpurile de array în InterBase, așa cum este detaliat în capitolul "Caracteristici speciale ale FIBPlus". Biblioteca client IBProvider, permițându-vă să creați aplicații client pentru Interbase folosind mediul de dezvoltare Microsoft sprijină, de asemenea, matrice (a se vedea cap. „Dezvoltarea aplicațiilor client de baze de date Interbase folosind tehnologii Microsoft OLE DB“ (cap. 3)).

Trebuie remarcat faptul că este imposibil să se spună despre tipurile de date fără a se uita înainte, astfel încât acestea să pătrundă în toate domeniile-cheie legate de dezvoltarea aplicațiilor bazei de date. Prin urmare, în procesul de citire a acestei cărți, merită să folosiți acest capitol ca o carte de referință, care poate fi accesată ori de câte ori aveți nevoie să actualizați cadrul InterBase.

Articole similare