Panimula sa Mga Uri ng Data sa SQL
Hindi tulad ng JavaScript, ang SQL ay may malakas na pag-type. Sa bawat talahanayan, ang bawat column ay may sariling nakapirming uri ng data.
Maraming uri ng data, ngunit hindi tulad ng wikang Java, napakarami nito hindi dahil may mga uri ng data para sa lahat ng okasyon. Ang mga database ay lubos na nakadepende sa laki ng data, kaya maraming uri ng data ang naiiba sa bawat isa lamang sa haba.
Sa kabuuan, ang mga uri ng data ay maaaring hatiin sa 5 pangkat:
- Mga uri ng numero
- Mga uri ng string
- Mga uri para sa pag-iimbak ng mga petsa at oras
- Mga bagay: karaniwang kinakatawan bilang isang koleksyon ng mga byte
- Transportasyon : JSON at XML
Karaniwan ang iba't ibang DBMS ay mayroon pa ring sariling mga uri ng data. Ang bawat DBMS ay may sariling espesyalisasyon, kaya ang pagdaragdag ng mga bagong uri ng data ay isang pangkaraniwang bagay.
Ang isa pang bagay ay ang pagdaragdag lamang ng isang bagong uri ng data ay hindi sapat, kailangan mong magdagdag ng mga pag-andar na gagana dito, pati na rin gawin itong maginhawa at mabilis.
Kung nagtatrabaho ka sa anumang pang-industriya (enterprise) DBMS, malamang na kailangan mong harapin ang mga uri ng data nito at ang mga function nito. Para sa kung ano ang kinakailangan na magbasa ng 2-5 magagandang libro.
Bilang bahagi ng aming kakilala sa SQL, isasaalang-alang namin ang tatlong pangunahing grupo ng mga uri ng data:
- Numero
- Mga string
- Petsa
Mga Uri ng Numeric sa SQL
Sa SQL, ang mga uri ng numero ay nahahati sa tatlong grupo:
- Mga uri ng integer
- Mga numero ng nakapirming punto (nakatakdang bilang ng mga decimal na lugar)
- Mga numero ng floating point
Magsimula tayo sa mga integer . Mayroon lamang 5 sa kanila, at maaari silang ilarawan sa isang talahanayan:
# | I-type ang pangalan | Haba sa bytes | Analogue mula sa Java | Pinakamababang halaga | Pinakamataas na halaga |
---|---|---|---|---|---|
1 | TINYINT | 1 | byte | -128 | 127 |
2 | MALIIT | 2 | maikli | -32.768 | 32.767 |
3 | MEDIUMINT | 3 | -8,388,608 | 8,388,607 | |
4 | INT | 4 | int | -2,147,483,648 | 2,147,483,647 |
5 | BIGINT | 8 | mahaba | -2 63 | 2 63-1 |
Ang mga uri ng data ay halos kapareho sa mga uri ng data ng Java, ngunit mayroon ding uri ng integer na tatlong byte ang haba. Ginagawa ito upang makatipid sa laki.
Susunod na dumating ang mga uri ng floating point , tulad ng sa Java, dalawa lang ang mga ito:
# | I-type ang pangalan | Haba sa bytes | Analogue mula sa Java | Pinakamababang halaga | Pinakamataas na halaga |
---|---|---|---|---|---|
1 | LUMUTANG | 4 | lumutang | -3.40E+38 | +1.18E+38 |
2 | DOBLE | 8 | doble | -1.79E+308 | +1.79E+308 |
Muli, walang bago. Ang lahat ay pareho sa Java. Gayunpaman, hindi tulad ng Java, ang SQL ay may isa pang espesyal na uri, ang fixed-point real number. Ito ay tinatawag na DECIMAL.
Karaniwan ang ganitong uri ay ginagamit upang mag-imbak ng mga halaga ng pera. Kapag ang pangalan ng ganitong uri ay isinulat, pagkatapos nito ay karaniwang ipinapahiwatig kung gaano karaming mga decimal na lugar ang numero bago at pagkatapos ng decimal point. Ang pangkalahatang format ay ganito ang hitsura:
DECIMAL(total_characters, after_comma)
At isang maliit na halimbawa:
salary DECIMAL(5,2)
Ito ay kung paano namin inilarawan ang katotohanan na ang hanay ng suweldo ay maaaring maglaman ng mga integer (maximum na 3 decimal na lugar) at isang fractional na bahagi - 2 decimal na lugar.
Ang maximum na bilang ng mga character na sinusuportahan ng uri ng DECIMAL ay 65.
Mga uri ng string sa SQL
Ang mga hilera sa isang database ay maaaring maimbak sa dalawang anyo:
- Nakapirming mga string ng haba
- Mga string na may variable na haba
Ang mga fixed-length na string ay tinukoy bilang CHAR :
CHAR(length)
Ang nakapirming haba ay nangangahulugan na ang lahat ng mga halaga ng column na ito ay maglalaman ng mahigpit na nakapirming bilang ng mga character.
Isang halimbawa ng isang nakapirming haba na string:
country_code CHAR(2)
Ang mga string ng variable na haba ay tinukoy ng uri ng VARCHAR :
VARCHAR(max_length)
Ang variable na haba ay nangangahulugan na ang lahat ng mga halaga ng column na ito ay maglalaman ng teksto ng anumang haba, ngunit hindi hihigit sa maximum na haba.
Halimbawa ng variable na haba ng string:
phone VARCHAR(12)
Ang mga nakapirming haba na mga string ay may napakalaking kalamangan. Kung hiniling ng kliyente sa SQL server na ibalik sa kanya ang ika-1,000,000 na hilera mula sa talahanayan, at ang mga hilera sa talahanayan ay may nakapirming haba, kung gayon, alam ang haba ng hilera, madali mong makalkula ang mga byte na nauugnay sa nais hilera.
Sa kaso ng isang variable na haba ng mga linya, hindi posible na mabilis na mahanap ang nais na row sa talahanayan. Tandaan ang bilis ng pag-access sa ArrayList at LinkedList, ang sitwasyon ay halos pareho dito.
Ihambing natin kung paano iimbak ang mga string na may iba't ibang haba sa isang talahanayan, depende sa uri ng data.
Linya | CHAR(4) | Byte sa tindahan | VARCHAR(4) | Byte sa tindahan | |
---|---|---|---|---|---|
'' | '' | 4 | '' | 1 | |
'ab' | 'ab' | 4 | 'ab' | 3 | |
'a B C D' | 'a B C D' | 4 | 'a B C D' | 5 | |
'abcdefgh' | 'a B C D' | 4 | 'a B C D' | 5 |
Tandaan. Ang uri ng VARCHAR ay nangangailangan ng isa pang byte para sa parehong haba, dahil kailangan din nitong iimbak ang haba ng string.
Mga pansamantalang uri sa SQL
Ang SQL ay mayroon ding mga espesyal na uri para sa pag-iimbak ng mga petsa at oras. Mayroong limang uri sa kabuuan:
# | I-type ang pangalan | Analogue mula sa Java DateTime API | Halimbawa | Pinakamababang halaga | Pinakamataas na halaga |
---|---|---|---|---|---|
1 | DATE | LocalDate | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | ORAS | Lokal na Oras | 'hh:mm:ss[.fraction]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | DATETIME | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | TIMESTAMP | Petsa | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | YEAR | 1901 | 2155 |
Ang lahat ng data sa mga query ay nakasulat bilang isang string - sa mga solong panipi. Ang format ng pagpasok ay mula sa pinakamalaki hanggang sa pinakamaliit:
- taon
- buwan
- Araw
- Oras
- minuto
- Pangalawa
- Mga fraction ng isang segundo
Ang mga uri ng DATE, TIME at DATETIME ay maaaring kumbensiyonal na ituring na mga analogue ng mga uri mula sa Java DateTme API: LocalDate, LocalTime, LocalDateTime. Ang lohika ay halos pareho.
Ang uri ng TIMESTAMP ay nag-iimbak ng data sa mga millisecond mula noong simula ng 1970 (isang UNIX operating system standard). Sa form na ito na sila ay naka-imbak ayon sa uri ng Petsa sa wikang Java.
At sa wakas, mayroong uri ng YEAR, na 1 byte ang haba at nag-iimbak ng mga halaga mula 1 hanggang 255. Samakatuwid, ang saklaw ng mga taon na magagamit dito ay 1901-2155. Ang taong 1900 ay hindi maiimbak ng ganitong uri, dahil ang halagang 0 ay ginagamit upang i-encode ang isang NULL na halaga.
Pag-iimbak ng mga bagay sa SQL
May mga espesyal na uri para sa pag-iimbak ng mga bagay o mga teksto na napakahaba. Hindi namin isa-isahin ang mga ito, ngunit ililista ko pa rin sila:
# | I-type ang pangalan | Paliwanag |
---|---|---|
1 | TEKSTO | Ginagamit upang mag-imbak ng mahahabang teksto. Kapag naghahambing at nag-uuri sa field na ito, ang unang 100 character lang ang ginagamit. |
2 | BLOB | Ang pangalan ay kumakatawan sa Byte Large Object. Naka-imbak bilang isang koleksyon lamang ng mga byte. Maaaring magamit upang, halimbawa, mag-imbak ng mga larawan sa isang database. |
3 | CLOB | Ang pangalan ay kumakatawan sa Char Large Object. Ginagamit upang mag-imbak ng mahahabang teksto. |
4 | ENUM | Binibigyang-daan kang magtakda ng isang nakapirming hanay ng mga halaga at mag-imbak ng isa sa mga ito bilang isang halaga. |
5 | ITAKDA | Binibigyang-daan kang magtakda ng isang nakapirming hanay ng mga halaga at mag-imbak ng anumang subset ng mga ito bilang isang halaga. Karaniwang iniimbak ang mga ito bilang isang binary mask. |
Sa teorya, maaari mong i-serialize ang anumang Java object bilang isang set ng mga byte at iimbak ito sa database bilang isang BLOB. Ang pag-save ng bagay ay hindi isang problema. Paano makipagtulungan sa kanya nang higit pa?
Sabihin nating ang isang talahanayan ay nag-iimbak ng isang milyong bagay sa serialized na anyo - paano mo hahanapin ang mga ito? Sinusuportahan lamang ng DBMS ang isang partikular na uri ng data kapag nagbibigay ito ng malawak na hanay ng mga function para sa pagtatrabaho dito.