You are on page 1of 1268

Wydawnictwo Helion

ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PRZYKADOWY ROZDZIA PRZYKADOWY ROZDZIA
IDZ DO IDZ DO
ZAMW DRUKOWANY KATALOG ZAMW DRUKOWANY KATALOG
KATALOG KSIEK KATALOG KSIEK
TWJ KOSZYK TWJ KOSZYK
CENNIK I INFORMACJE CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK ZAMW CENNIK
CZYTELNIA CZYTELNIA
FRAGMENTY KSIEK ONLINE FRAGMENTY KSIEK ONLINE
SPIS TRECI SPIS TRECI
DODAJ DO KOSZYKA DODAJ DO KOSZYKA
KATALOG ONLINE KATALOG ONLINE
MySQL. Opis jzyka
Autor: Paul Dubois
Tumaczenie: Pawe Gonera, Anna Zawadzka
ISBN: 83-7361-688-8
Tytu oryginau: MySQL Language Reference
Format: B5, stron: 472
MySQL to najpopularniejsza na wiecie baza danych dostpna na licencji open
source. Dziki swojej wydajnoci, szybkoci dziaania, stabilnoci i rozbudowanym
mechanizmom zabezpiecze jest wykorzystywana niemal do wszystkich zada, do
jakich moe by potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji
korporacyjnych, witryn WWW i sklepw internetowych. Bogactwo funkcji i moliwoci
to ogromna zaleta rodowiska MySQL, jednake zapamitanie skadni, parametrw
i sposobw stosowania wszystkich polece i rozszerze jest praktycznie niemoliwe.
Kady, kto chce biegle posugiwa si t baz, powinien mie pod rk materiay
opisujce stosowany w niej jzyk SQL.
Ksika MySQL. Opis jzyka to najlepsze rdo takich informacji. Stworzona,
zredagowana i sprawdzona przez pracownikw dziaw pomocy i produkcji firmy
MySQL AB publikacja zawiera wszystko, co moe by potrzebne uytkownikowi bazy
danych MySQL. Przedstawia zarwno zagadnienia podstawowe, takie jak: struktura
jzyka, typy danych i zasady konstruowania zapyta, jak i tematy zaawansowane:
transakcje, replikacj oraz administrowanie baz. Szczegowo opisane s rwnie
wszystkie zagadnienia zwizane z zaimplementowanym w niej jzykiem SQL.
Podstawowe informacje o MySQL
Jzyk SQL instrukcje, typy danych, funkcje i operatory
Zapytania
Definiowanie danych
Obsuga transakcji
Zarzdzanie kontami uytkownikw
Konserwacja tabel
Replikacja baz danych
Rozszerzenia MySQL dla systemw GIS
Procedury skadowane
Obsuga bdw
Spis treci
Rozdzia 1. Informacje oglne.............................................................................. 9
1.1. Na temat tego podrcznika....................................................................................... 9
1.1.1. Zasady przyjte w tym podrczniku .......................................................... 10
1.2. Omwienie systemu zarzdzania baz danych MySQL......................................... 12
1.2.1. Historia MySQL........................................................................................ 13
1.2.2. Gwne cechy MySQL.............................................................................. 14
1.2.3. Stabilno MySQL .................................................................................... 17
1.2.4. Jak due mog by tabele MySQL ............................................................ 18
1.2.5. Zgodno z rokiem 2000 ........................................................................... 19
1.3. Omwienie MySQL AB ........................................................................................ 21
1.3.1. Model biznesowy i usugi MySQL AB...................................................... 22
1.3.2. Informacje o kontakcie .............................................................................. 25
1.4. Obsuga techniczna oraz wydawanie licencji MySQL........................................... 26
1.4.1. Obsuga techniczna oferowana przez MySQL AB........................................ 26
1.4.2. Prawa autorskie i licencje .......................................................................... 27
1.4.3. Licencje MySQL ....................................................................................... 28
1.4.4. Logo i znaki towarowe MySQL ................................................................ 30
1.5. Plany rozwoju MySQL .......................................................................................... 32
1.5.1. MySQL 4.0 w skrcie................................................................................ 33
1.5.2. MySQL 4.1 w skrcie................................................................................ 35
1.5.3. MySQL 5.0: nastpna wersja rozwojowa .................................................. 37
1.6. MySQL i przyszo (TODO) ................................................................................ 37
1.6.1. Nowe mechanizmy planowane dla wersji 4.1............................................ 38
1.6.2. Nowe funkcje planowane dla wersji 5.0.................................................... 38
1.6.3. Nowe funkcje planowane dla 5.1............................................................... 39
1.6.4. Nowe funkcje planowane w bliskiej przyszoci ......................................... 40
1.6.5. Nowe funkcje planowane w niezbyt odlegej przyszoci.......................... 43
1.6.6. Nowe funkcje, ktrych wdroenia nie planujemy.......................................... 44
1.7. rda informacji o MySQL .................................................................................. 45
1.7.1. Listy dyskusyjne powicone MySQL ...................................................... 45
1.7.2. Wspomaganie rodowiska MySQL na IRC (Internet Relay Chat)............. 54
1.8. Zgodno MySQL ze standardami ......................................................................... 55
1.8.1. Standardy speniane przez MySQL............................................................ 56
1.8.2. Wybieranie trybw MySQL ...................................................................... 56
1.8.3. Uruchamianie MySQL w trybie ANSI ...................................................... 56
1.8.4. Rozszerzenia MySQL do standardu SQL.................................................. 57
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PRZYKADOWY ROZDZIA PRZYKADOWY ROZDZIA
IDZ DO IDZ DO
ZAMW DRUKOWANY KATALOG ZAMW DRUKOWANY KATALOG
KATALOG KSIEK KATALOG KSIEK
TWJ KOSZYK TWJ KOSZYK
CENNIK I INFORMACJE CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK ZAMW CENNIK
CZYTELNIA CZYTELNIA
FRAGMENTY KSIEK ONLINE FRAGMENTY KSIEK ONLINE
SPIS TRECI SPIS TRECI
DODAJ DO KOSZYKA DODAJ DO KOSZYKA
KATALOG ONLINE KATALOG ONLINE
MySQL. Opis jzyka
Autor: Paul Dubois
Tumaczenie: Pawe Gonera, Anna Zawadzka
ISBN: 83-7361-688-8
Tytu oryginau: MySQL Language Reference
Format: B5, stron: 472
MySQL to najpopularniejsza na wiecie baza danych dostpna na licencji open
source. Dziki swojej wydajnoci, szybkoci dziaania, stabilnoci i rozbudowanym
mechanizmom zabezpiecze jest wykorzystywana niemal do wszystkich zada, do
jakich moe by potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji
korporacyjnych, witryn WWW i sklepw internetowych. Bogactwo funkcji i moliwoci
to ogromna zaleta rodowiska MySQL, jednake zapamitanie skadni, parametrw
i sposobw stosowania wszystkich polece i rozszerze jest praktycznie niemoliwe.
Kady, kto chce biegle posugiwa si t baz, powinien mie pod rk materiay
opisujce stosowany w niej jzyk SQL.
Ksika MySQL. Opis jzyka to najlepsze rdo takich informacji. Stworzona,
zredagowana i sprawdzona przez pracownikw dziaw pomocy i produkcji firmy
MySQL AB publikacja zawiera wszystko, co moe by potrzebne uytkownikowi bazy
danych MySQL. Przedstawia zarwno zagadnienia podstawowe, takie jak: struktura
jzyka, typy danych i zasady konstruowania zapyta, jak i tematy zaawansowane:
transakcje, replikacj oraz administrowanie baz. Szczegowo opisane s rwnie
wszystkie zagadnienia zwizane z zaimplementowanym w niej jzykiem SQL.
Podstawowe informacje o MySQL
Jzyk SQL instrukcje, typy danych, funkcje i operatory
Zapytania
Definiowanie danych
Obsuga transakcji
Zarzdzanie kontami uytkownikw
Konserwacja tabel
Replikacja baz danych
Rozszerzenia MySQL dla systemw GIS
Procedury skadowane
Obsuga bdw
Spis treci
Rozdzia 1. Informacje oglne.............................................................................. 9
1.1. Na temat tego podrcznika....................................................................................... 9
1.1.1. Zasady przyjte w tym podrczniku .......................................................... 10
1.2. Omwienie systemu zarzdzania baz danych MySQL......................................... 12
1.2.1. Historia MySQL........................................................................................ 13
1.2.2. Gwne cechy MySQL.............................................................................. 14
1.2.3. Stabilno MySQL .................................................................................... 17
1.2.4. Jak due mog by tabele MySQL ............................................................ 18
1.2.5. Zgodno z rokiem 2000 ........................................................................... 19
1.3. Omwienie MySQL AB ........................................................................................ 21
1.3.1. Model biznesowy i usugi MySQL AB...................................................... 22
1.3.2. Informacje o kontakcie .............................................................................. 25
1.4. Obsuga techniczna oraz wydawanie licencji MySQL........................................... 26
1.4.1. Obsuga techniczna oferowana przez MySQL AB........................................ 26
1.4.2. Prawa autorskie i licencje .......................................................................... 27
1.4.3. Licencje MySQL ....................................................................................... 28
1.4.4. Logo i znaki towarowe MySQL ................................................................ 30
1.5. Plany rozwoju MySQL .......................................................................................... 32
1.5.1. MySQL 4.0 w skrcie................................................................................ 33
1.5.2. MySQL 4.1 w skrcie................................................................................ 35
1.5.3. MySQL 5.0: nastpna wersja rozwojowa .................................................. 37
1.6. MySQL i przyszo (TODO) ................................................................................ 37
1.6.1. Nowe mechanizmy planowane dla wersji 4.1............................................ 38
1.6.2. Nowe funkcje planowane dla wersji 5.0.................................................... 38
1.6.3. Nowe funkcje planowane dla 5.1............................................................... 39
1.6.4. Nowe funkcje planowane w bliskiej przyszoci ......................................... 40
1.6.5. Nowe funkcje planowane w niezbyt odlegej przyszoci.......................... 43
1.6.6. Nowe funkcje, ktrych wdroenia nie planujemy.......................................... 44
1.7. rda informacji o MySQL .................................................................................. 45
1.7.1. Listy dyskusyjne powicone MySQL ...................................................... 45
1.7.2. Wspomaganie rodowiska MySQL na IRC (Internet Relay Chat)............. 54
1.8. Zgodno MySQL ze standardami ......................................................................... 55
1.8.1. Standardy speniane przez MySQL............................................................ 56
1.8.2. Wybieranie trybw MySQL ...................................................................... 56
1.8.3. Uruchamianie MySQL w trybie ANSI ...................................................... 56
1.8.4. Rozszerzenia MySQL do standardu SQL.................................................. 57
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PRZYKADOWY ROZDZIA PRZYKADOWY ROZDZIA
IDZ DO IDZ DO
ZAMW DRUKOWANY KATALOG ZAMW DRUKOWANY KATALOG
KATALOG KSIEK KATALOG KSIEK
TWJ KOSZYK TWJ KOSZYK
CENNIK I INFORMACJE CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK ZAMW CENNIK
CZYTELNIA CZYTELNIA
FRAGMENTY KSIEK ONLINE FRAGMENTY KSIEK ONLINE
SPIS TRECI SPIS TRECI
DODAJ DO KOSZYKA DODAJ DO KOSZYKA
KATALOG ONLINE KATALOG ONLINE
MySQL. Opis jzyka
Autor: Paul Dubois
Tumaczenie: Pawe Gonera, Anna Zawadzka
ISBN: 83-7361-688-8
Tytu oryginau: MySQL Language Reference
Format: B5, stron: 472
MySQL to najpopularniejsza na wiecie baza danych dostpna na licencji open
source. Dziki swojej wydajnoci, szybkoci dziaania, stabilnoci i rozbudowanym
mechanizmom zabezpiecze jest wykorzystywana niemal do wszystkich zada, do
jakich moe by potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji
korporacyjnych, witryn WWW i sklepw internetowych. Bogactwo funkcji i moliwoci
to ogromna zaleta rodowiska MySQL, jednake zapamitanie skadni, parametrw
i sposobw stosowania wszystkich polece i rozszerze jest praktycznie niemoliwe.
Kady, kto chce biegle posugiwa si t baz, powinien mie pod rk materiay
opisujce stosowany w niej jzyk SQL.
Ksika MySQL. Opis jzyka to najlepsze rdo takich informacji. Stworzona,
zredagowana i sprawdzona przez pracownikw dziaw pomocy i produkcji firmy
MySQL AB publikacja zawiera wszystko, co moe by potrzebne uytkownikowi bazy
danych MySQL. Przedstawia zarwno zagadnienia podstawowe, takie jak: struktura
jzyka, typy danych i zasady konstruowania zapyta, jak i tematy zaawansowane:
transakcje, replikacj oraz administrowanie baz. Szczegowo opisane s rwnie
wszystkie zagadnienia zwizane z zaimplementowanym w niej jzykiem SQL.
Podstawowe informacje o MySQL
Jzyk SQL instrukcje, typy danych, funkcje i operatory
Zapytania
Definiowanie danych
Obsuga transakcji
Zarzdzanie kontami uytkownikw
Konserwacja tabel
Replikacja baz danych
Rozszerzenia MySQL dla systemw GIS
Procedury skadowane
Obsuga bdw
Spis treci
Rozdzia 1. Informacje oglne.............................................................................. 9
1.1. Na temat tego podrcznika....................................................................................... 9
1.1.1. Zasady przyjte w tym podrczniku .......................................................... 10
1.2. Omwienie systemu zarzdzania baz danych MySQL......................................... 12
1.2.1. Historia MySQL........................................................................................ 13
1.2.2. Gwne cechy MySQL.............................................................................. 14
1.2.3. Stabilno MySQL .................................................................................... 17
1.2.4. Jak due mog by tabele MySQL ............................................................ 18
1.2.5. Zgodno z rokiem 2000 ........................................................................... 19
1.3. Omwienie MySQL AB ........................................................................................ 21
1.3.1. Model biznesowy i usugi MySQL AB...................................................... 22
1.3.2. Informacje o kontakcie .............................................................................. 25
1.4. Obsuga techniczna oraz wydawanie licencji MySQL........................................... 26
1.4.1. Obsuga techniczna oferowana przez MySQL AB........................................ 26
1.4.2. Prawa autorskie i licencje .......................................................................... 27
1.4.3. Licencje MySQL ....................................................................................... 28
1.4.4. Logo i znaki towarowe MySQL ................................................................ 30
1.5. Plany rozwoju MySQL .......................................................................................... 32
1.5.1. MySQL 4.0 w skrcie................................................................................ 33
1.5.2. MySQL 4.1 w skrcie................................................................................ 35
1.5.3. MySQL 5.0: nastpna wersja rozwojowa .................................................. 37
1.6. MySQL i przyszo (TODO) ................................................................................ 37
1.6.1. Nowe mechanizmy planowane dla wersji 4.1............................................ 38
1.6.2. Nowe funkcje planowane dla wersji 5.0.................................................... 38
1.6.3. Nowe funkcje planowane dla 5.1............................................................... 39
1.6.4. Nowe funkcje planowane w bliskiej przyszoci ......................................... 40
1.6.5. Nowe funkcje planowane w niezbyt odlegej przyszoci.......................... 43
1.6.6. Nowe funkcje, ktrych wdroenia nie planujemy.......................................... 44
1.7. rda informacji o MySQL .................................................................................. 45
1.7.1. Listy dyskusyjne powicone MySQL ...................................................... 45
1.7.2. Wspomaganie rodowiska MySQL na IRC (Internet Relay Chat)............. 54
1.8. Zgodno MySQL ze standardami ......................................................................... 55
1.8.1. Standardy speniane przez MySQL............................................................ 56
1.8.2. Wybieranie trybw MySQL ...................................................................... 56
1.8.3. Uruchamianie MySQL w trybie ANSI ...................................................... 56
1.8.4. Rozszerzenia MySQL do standardu SQL.................................................. 57
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PRZYKADOWY ROZDZIA PRZYKADOWY ROZDZIA
IDZ DO IDZ DO
ZAMW DRUKOWANY KATALOG ZAMW DRUKOWANY KATALOG
KATALOG KSIEK KATALOG KSIEK
TWJ KOSZYK TWJ KOSZYK
CENNIK I INFORMACJE CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK ZAMW CENNIK
CZYTELNIA CZYTELNIA
FRAGMENTY KSIEK ONLINE FRAGMENTY KSIEK ONLINE
SPIS TRECI SPIS TRECI
DODAJ DO KOSZYKA DODAJ DO KOSZYKA
KATALOG ONLINE KATALOG ONLINE
MySQL. Opis jzyka
Autor: Paul Dubois
Tumaczenie: Pawe Gonera, Anna Zawadzka
ISBN: 83-7361-688-8
Tytu oryginau: MySQL Language Reference
Format: B5, stron: 472
MySQL to najpopularniejsza na wiecie baza danych dostpna na licencji open
source. Dziki swojej wydajnoci, szybkoci dziaania, stabilnoci i rozbudowanym
mechanizmom zabezpiecze jest wykorzystywana niemal do wszystkich zada, do
jakich moe by potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji
korporacyjnych, witryn WWW i sklepw internetowych. Bogactwo funkcji i moliwoci
to ogromna zaleta rodowiska MySQL, jednake zapamitanie skadni, parametrw
i sposobw stosowania wszystkich polece i rozszerze jest praktycznie niemoliwe.
Kady, kto chce biegle posugiwa si t baz, powinien mie pod rk materiay
opisujce stosowany w niej jzyk SQL.
Ksika MySQL. Opis jzyka to najlepsze rdo takich informacji. Stworzona,
zredagowana i sprawdzona przez pracownikw dziaw pomocy i produkcji firmy
MySQL AB publikacja zawiera wszystko, co moe by potrzebne uytkownikowi bazy
danych MySQL. Przedstawia zarwno zagadnienia podstawowe, takie jak: struktura
jzyka, typy danych i zasady konstruowania zapyta, jak i tematy zaawansowane:
transakcje, replikacj oraz administrowanie baz. Szczegowo opisane s rwnie
wszystkie zagadnienia zwizane z zaimplementowanym w niej jzykiem SQL.
Podstawowe informacje o MySQL
Jzyk SQL instrukcje, typy danych, funkcje i operatory
Zapytania
Definiowanie danych
Obsuga transakcji
Zarzdzanie kontami uytkownikw
Konserwacja tabel
Replikacja baz danych
Rozszerzenia MySQL dla systemw GIS
Procedury skadowane
Obsuga bdw
Spis treci
Rozdzia 1. Informacje oglne.............................................................................. 9
1.1. Na temat tego podrcznika....................................................................................... 9
1.1.1. Zasady przyjte w tym podrczniku .......................................................... 10
1.2. Omwienie systemu zarzdzania baz danych MySQL......................................... 12
1.2.1. Historia MySQL........................................................................................ 13
1.2.2. Gwne cechy MySQL.............................................................................. 14
1.2.3. Stabilno MySQL .................................................................................... 17
1.2.4. Jak due mog by tabele MySQL ............................................................ 18
1.2.5. Zgodno z rokiem 2000 ........................................................................... 19
1.3. Omwienie MySQL AB ........................................................................................ 21
1.3.1. Model biznesowy i usugi MySQL AB...................................................... 22
1.3.2. Informacje o kontakcie .............................................................................. 25
1.4. Obsuga techniczna oraz wydawanie licencji MySQL........................................... 26
1.4.1. Obsuga techniczna oferowana przez MySQL AB........................................ 26
1.4.2. Prawa autorskie i licencje .......................................................................... 27
1.4.3. Licencje MySQL ....................................................................................... 28
1.4.4. Logo i znaki towarowe MySQL ................................................................ 30
1.5. Plany rozwoju MySQL .......................................................................................... 32
1.5.1. MySQL 4.0 w skrcie................................................................................ 33
1.5.2. MySQL 4.1 w skrcie................................................................................ 35
1.5.3. MySQL 5.0: nastpna wersja rozwojowa .................................................. 37
1.6. MySQL i przyszo (TODO) ................................................................................ 37
1.6.1. Nowe mechanizmy planowane dla wersji 4.1............................................ 38
1.6.2. Nowe funkcje planowane dla wersji 5.0.................................................... 38
1.6.3. Nowe funkcje planowane dla 5.1............................................................... 39
1.6.4. Nowe funkcje planowane w bliskiej przyszoci ......................................... 40
1.6.5. Nowe funkcje planowane w niezbyt odlegej przyszoci.......................... 43
1.6.6. Nowe funkcje, ktrych wdroenia nie planujemy.......................................... 44
1.7. rda informacji o MySQL .................................................................................. 45
1.7.1. Listy dyskusyjne powicone MySQL ...................................................... 45
1.7.2. Wspomaganie rodowiska MySQL na IRC (Internet Relay Chat)............. 54
1.8. Zgodno MySQL ze standardami ......................................................................... 55
1.8.1. Standardy speniane przez MySQL............................................................ 56
1.8.2. Wybieranie trybw MySQL ...................................................................... 56
1.8.3. Uruchamianie MySQL w trybie ANSI ...................................................... 56
1.8.4. Rozszerzenia MySQL do standardu SQL.................................................. 57
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
4 Spis treci
1.8.5. Rozbienoci midzy MySQL a standardem SQL ........................................ 60
1.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 67
1.8.7. Znane bdy i projektowe braki w MySQL................................................ 69
Rozdzia 2. Struktura jzyka .............................................................................. 77
2.1. Literay................................................................................................................... 77
2.1.1. acuchy ................................................................................................... 77
2.1.2. Liczby........................................................................................................ 80
2.1.3. Wartoci szesnastkowe .............................................................................. 80
2.1.4. Wartoci logiczne ...................................................................................... 81
2.1.5. Wartoci NULL......................................................................................... 81
2.2. Nazwy baz danych, tabel, indeksw, kolumn i aliasw......................................... 81
2.2.1. Kwalifikatory identyfikatorw .................................................................. 83
2.2.2. Znaczenie wielkoci liter w nazwach identyfikatorw.............................. 83
2.3. Zmienne definiowane przez uytkownika.............................................................. 85
2.4. Zmienne systemowe............................................................................................... 87
2.4.1. Strukturalne zmienne systemowe .............................................................. 89
2.5. Skadnia komentarza .............................................................................................. 91
2.6. Traktowanie sw zastrzeonych w MySQL.......................................................... 92
Rozdzia 3. Obsuga zestaww znakw............................................................... 95
3.1. Oglne informacje o zestawach znakw i sortowaniu ........................................... 95
3.2. Zestawy znakw i porzdki sortowania w MySQL................................................ 96
3.3. Okrelanie domylnego zestawu znakw i sortowania........................................... 98
3.3.1. Zestaw znakw i sortowanie dla serwera................................................... 98
3.3.2. Zestaw znakw i sortowanie dla bazy danych........................................... 99
3.3.3. Zestaw znakw i sortowanie dla tabeli .................................................... 100
3.3.4. Zestaw znakw i sortowanie dla kolumny............................................... 100
3.3.5. Przykady przypisywania zestawu znakw i sortowania ......................... 101
3.3.6. Zestawy znakw i sortowanie dla poczenia .......................................... 102
3.3.7. Zestaw znakw i sortowanie dla acucha znakw.................................. 104
3.3.8. Wykorzystywanie COLLATE w instrukcjach SQL.................................... 105
3.3.9. Priorytet klauzuli COLLATE .................................................................. 106
3.3.10. Operator BINARY................................................................................... 106
3.3.11. Niektre przypadki specjalne, w ktrych trudno okreli sortowanie...... 106
3.3.12. Sortowania musz by odpowiednie dla danego zestawu znakw........... 107
3.3.13. Przykad wpywu porzdku sortowania ................................................... 108
3.4. Operacje, na ktre ma wpyw obsuga zestaww znakw.................................... 109
3.4.1. acuchy wyjciowe ............................................................................... 109
3.4.2. CONVERT()............................................................................................ 110
3.4.3. CAST() .................................................................................................... 110
3.4.4. Instrukcje SHOW .................................................................................... 111
3.5. Obsuga Unicode.................................................................................................. 112
3.6. UTF8 dla metadanych.......................................................................................... 113
3.7. Kompatybilno z innymi systemami zarzdzania baz danych .......................... 115
3.8. Nowy format pliku konfiguracji zestawu znakw................................................ 115
3.9. Narodowe zestawy znakw.................................................................................. 115
3.10. Aktualizacja zestaww znakw z MySQL 4.0..................................................... 116
3.10.1. Zestawy znakw w wersji 4.0 i odpowiadajce im w wersji 4.1 pary
skadajce si z zestawu znakw i sortowania......................................... 117
3.10.2. Przeksztacanie kolumn znakowych wersji 4.0 na format 4.1 ................. 118
3.11. Zestawy znakw i sortowania obsugiwane przez MySQL.................................. 118
3.11.1. Zestawy znakw standardu Unicode ....................................................... 119
3.11.2. Zestawy znakw zachodnioeuropejskich................................................. 120
3.11.3. Zestawy znakw dla Europy Centralnej .................................................. 121
Spis treci 5
3.11.4. Zestawy znakw poudniowoeuropejskich i rodkowowschodnich......... 122
3.11.5. Zestawy znakw regionu batyckiego...................................................... 123
3.11.6. Zestawy znakw dla cyrylicy................................................................... 123
3.11.7. Azjatyckie zestawy znakw..................................................................... 124
Rozdzia 4. Typy kolumn.................................................................................. 125
4.1. Przegld typw dla kolumny................................................................................ 126
4.1.1. Omwienie typw liczbowych ................................................................ 126
4.1.2. Przegld typw zwizanych z dat i czasem............................................ 129
4.1.3. Przegld typw acuchowych ................................................................ 130
4.2. Typy liczbowe...................................................................................................... 132
4.3. Typy zwizane z dat i czasem............................................................................ 135
4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 137
4.3.2. Typ TIME................................................................................................ 142
4.3.3. Typ YEAR............................................................................................... 143
4.3.4. Problem roku 2000 a typy zwizane z dat.............................................. 144
4.4. Typy acuchowe ................................................................................................. 144
4.4.1. Typy CHAR i VARCHAR...................................................................... 144
4.4.2. Typy BLOB i TEXT................................................................................ 146
4.4.3. Typ Enum................................................................................................ 147
4.4.4. Typ SET .................................................................................................. 149
4.5. Rozmiar pamici potrzebnej dla typw kolumn................................................... 151
4.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 152
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych ............... 153
Rozdzia 5. Funkcje i operatory........................................................................ 155
5.1. Operatory ............................................................................................................. 156
5.1.1. Nawiasy................................................................................................... 156
5.1.2. Operatory porwnania ............................................................................. 156
5.1.3. Operatory logiczne .................................................................................. 161
5.1.4. Operatory rozrniania wielkoci liter..................................................... 163
5.2. Funkcje kontroli przepywu ................................................................................. 163
5.3. Funkcje acuchowe............................................................................................. 166
5.3.1. Funkcje porwnywania acuchw.......................................................... 176
5.4. Funkcje liczbowe ................................................................................................. 178
5.4.1. Operatory arytmetyczne........................................................................... 178
5.4.2. Funkcje matematyczne ............................................................................ 180
5.5. Funkcje daty i godziny......................................................................................... 186
5.6. Funkcje obsugi wyszukiwania penotekstowego................................................. 202
5.6.1. Boolowskie wyszukiwania penotekstowe............................................... 205
5.6.2. Wyszukiwania penotekstowe z rozwijaniem zapytania .......................... 207
5.6.3. Ograniczenia dla wyszukiwania penotekstowego................................... 208
5.6.4. Modyfikowanie wyszukiwania penotekstowego MySQL ...................... 209
5.6.5. Lista rzeczy do zrobienia dla wyszukiwania penotekstowego................ 211
5.7. Funkcje konwersji typw..................................................................................... 211
5.8. Inne funkcje ......................................................................................................... 214
5.8.1. Funkcje bitowe ........................................................................................ 214
5.8.2. Funkcje szyfrujce................................................................................... 215
5.8.3. Funkcje informacyjne .............................................................................. 219
5.8.4. Funkcje rne .......................................................................................... 223
5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 226
5.9.1. Funkcje GROUP BY (agregujce)........................................................... 226
5.9.2. Modyfikatory GROUP BY...................................................................... 229
5.9.3. GROUP BY z ukrytymi polami............................................................... 232
6 Spis treci
Rozdzia 6. Skadnia instrukcji SQL .................................................................. 235
6.1. Instrukcje operujce na danych............................................................................ 235
6.1.1. Skadnia instrukcji DELETE................................................................... 235
6.1.2. Skadnia instrukcji DO ............................................................................ 238
6.1.3. Skadnia instrukcji HANDLER............................................................... 238
6.1.4. Skadnia instrukcji INSERT .................................................................... 240
6.1.5. Skadnia instrukcji LOAD DATA INFILE.............................................. 246
6.1.6. Skadnia instrukcji REPLACE................................................................. 255
6.1.7. Skadnia instrukcji SELECT.................................................................... 256
6.1.8. Skadnia podzapyta................................................................................ 265
6.1.9. Skadnia instrukcji TRUNCATE............................................................. 276
6.1.10. Skadnia instrukcji UPDATE................................................................... 276
6.2. Instrukcje definiowania danych ........................................................................... 278
6.2.1. Skadnia instrukcji ALTER DATABASE ............................................... 278
6.2.2. Skadnia instrukcji ALTER TABLE........................................................ 279
6.2.3. Skadnia instrukcji CREATE DATABASE............................................. 285
6.2.4. Skadnia instrukcji CREATE INDEX ..................................................... 285
6.2.5. Skadnia instrukcji CREATE TABLE..................................................... 287
6.2.6. Skadnia instrukcji DROP DATABASE.................................................. 301
6.2.7. Skadnia instrukcji DROP INDEX.......................................................... 302
6.2.8. Skadnia instrukcji DROP TABLE.......................................................... 302
6.2.9. Skadnia instrukcji RENAME TABLE.................................................... 303
6.3. Instrukcje programu MySQL............................................................................... 304
6.3.1. Skadnia instrukcji DESCRIBE
(odczytywanie informacji na temat kolumn) ........................................... 304
6.3.2. Skadnia instrukcji USE........................................................................... 304
6.4. Instrukcje obsugi transakcji i blokowania........................................................... 305
6.4.1. Skadnia instrukcji START TRANSACTION, COMMIT
oraz ROLLBACK.................................................................................... 305
6.4.2. Instrukcje niemoliwe do wycofania ....................................................... 306
6.4.3. Instrukcje wykonujce niejawne zatwierdzenie......................................... 306
6.4.4. Skadnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 307
6.4.5. Skadnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 307
6.4.6. Skadnia instrukcji SET TRANSACTION.............................................. 310
6.5. Administracja baz danych .................................................................................. 311
6.5.1. Instrukcje zarzdzajce kontami uytkownikw ....................................... 311
6.5.2. Instrukcje do konserwacji tabel ............................................................... 319
6.5.3. Skadnia instrukcji SET i SHOW ............................................................ 326
6.5.4. Inne instrukcje administracyjne ............................................................... 347
6.6. Instrukcje replikacji.............................................................................................. 352
6.6.1. Instrukcje SQL sterujce serwerem gwnym ......................................... 352
6.6.2. Instrukcje SQL sterujce serwerami podrzdnymi .................................. 354
Rozdzia 7. Rozszerzenia przestrzenne w MySQL............................................... 365
7.1. Wstp ................................................................................................................... 365
7.2. Model geometryczny OpenGIS............................................................................ 366
7.2.1. Hierarchia klas geometrycznych.............................................................. 366
7.2.2. Klasa Geometry ....................................................................................... 368
7.2.3. Klasa Point .............................................................................................. 369
7.2.4. Klasa Curve ............................................................................................. 369
7.2.5. Klasa LineString...................................................................................... 370
7.2.6. Klasa Surface........................................................................................... 370
7.2.7. Klasa Polygon.......................................................................................... 370
7.2.8. Klasa GeometryCollection....................................................................... 371
Spis treci 7
7.2.9. Klasa MultiPoint...................................................................................... 371
7.2.10. Klasa MultiCurve .................................................................................... 372
7.2.11. Klasa MultiLineString............................................................................. 372
7.2.12. Klasa MultiSurface .................................................................................. 372
7.2.13. Klasa MultiPolygon................................................................................. 373
7.3. Obsugiwane formaty danych przestrzennych...................................................... 373
7.3.1. Format tekstowy WKT............................................................................ 374
7.3.2. Format binarny WKB.............................................................................. 374
7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 375
7.4.1. Typy danych przestrzennych w MySQL ................................................. 375
7.4.2. Tworzenie wartoci przestrzennych......................................................... 376
7.4.3. Tworzenie kolumn przestrzennych.......................................................... 379
7.4.4. Wypenianie kolumn przestrzennych....................................................... 379
7.4.5. Pobieranie danych przestrzennych........................................................... 381
7.5. Analiza informacji przestrzennych....................................................................... 381
7.5.1. Funkcje konwersji formatw geometrycznych ........................................ 382
7.5.2. Funkcje klasy Geometry.......................................................................... 382
7.5.3. Funkcje tworzce nowe geometrie na podstawie istniejcych................. 388
7.5.4. Funkcje testujce relacje przestrzenne
midzy obiektami geometrycznymi ......................................................... 389
7.5.5. Relacje midzy minimalnymi prostoktami otaczajcymi
dla poszczeglnych geometrii.................................................................. 390
7.5.6. Funkcje sprawdzajce relacje przestrzenne pomidzy geometriami ........ 391
7.6. Optymalizacja analizy przestrzennej.................................................................... 392
7.6.1. Tworzenie indeksw przestrzennych....................................................... 392
7.6.2. Wykorzystanie indeksu przestrzennego................................................... 393
7.7. Zgodno MySQL ze standardem........................................................................ 395
7.7.1. Niezaimplementowane funkcje GIS ........................................................ 395
Rozdzia 8. Procedury i funkcje skadowane ..................................................... 397
8.1. Skadnia procedur skadowanych......................................................................... 398
8.1.1. Utrzymanie procedur skadowanych........................................................ 398
8.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 401
8.1.3. Instrukcja CALL...................................................................................... 402
8.1.4. Instrukcja zoona BEGIN ... END.......................................................... 402
8.1.5. Instrukcja DECLARE.............................................................................. 402
8.1.6. Zmienne w procedurach skadowanych................................................... 402
8.1.7. Warunki i podprogramy obsugi .............................................................. 403
8.1.8. Kursory.................................................................................................... 405
8.1.9. Konstrukcje sterowania przepywem sterowania..................................... 406
Rozdzia 9. Obsuga bdw w MySQL .............................................................. 409
9.1. Zwracane bdy.................................................................................................... 409
9.2. Komunikaty bdw............................................................................................. 419
Dodatek A Rozwizywanie problemw z zapytaniami ........................................435
A.1. Zagadnienia zwizane z zapytaniami ................................................................... 435
A.1.1. Wielko liter przy wyszukiwaniu........................................................... 435
A.1.2. Problemy z kolumnami typu DATE ........................................................ 436
A.1.3. Problemy z wartociami NULL............................................................... 437
A.1.4. Problemy z synonimami kolumn ............................................................. 438
A.1.5. Bd wycofania dla tabel nietransakcyjnych............................................ 439
A.1.6. Usuwanie wierszy ze zwizanych tabel ................................................... 439
A.1.7. Rozwizywanie problemw z brakujcymi wierszami ............................ 440
A.1.8. Problemy z porwnaniami zmiennoprzecinkowymi................................ 441
8 Spis treci
A.2. Problemy zwizane z optymalizatorem................................................................ 443
A.3. Problemy z definicj tabel.................................................................................... 444
A.3.1. Problemy z instrukcj ALTER TABLE................................................... 444
A.3.2. Jak zmieni porzdek kolumn w tabeli .................................................... 445
A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445
Dodatek B Wyraenia regularne w MySQL........................................................ 447
Skorowidz...................................................................................... 451
Rozdzia 4.
Typy kolumn
W MySQL dostpnych jest wiele typw danych, ktre mona pogrupowa w kilku pod-
stawowych kategoriach, takich jak typy liczbowe, typy zwizane z dat i czasem oraz
typy acuchowe. Na pocztku tego rozdziau przedstawiony zostanie przegld wspo-
mnianych przed chwil typw kolumn, po czym nastpi bardziej szczegowy opis ich
waciwoci z podziaem na poszczeglne kategorie i wreszcie zamieszczone zostanie
podsumowanie informacji dotyczcych wymaga co do rozmiaru pamici potrzebnej
do przechowania danej kolumny. Sam przegld jest z zamierzenia krtki. Dodatkowe
informacje o poszczeglnych typach kolumn, na przykad dopuszczalny format, w kt-
rym mona deklarowa wartoci, zostay uwzgldnione w szczegowych omwieniach.
Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsugi danych przestrzennych.
Informacje o typach przestrzennych znajduj si w rozdziale 7. tego podrcznika.
W czci opisu typw kolumn zastosowane zostay nastpujce reguy:
/
Wskazuje maksymalny rozmiar wywietlania liczby lub acucha.
Maksymalnym dopuszczalnym rozmiarem wywietlania jest 255.
&
Dotyczy typw zmiennoprzecinkowych i staoprzecinkowych. Okrela liczb
cyfr po kropce dziesitnej. Maksymalna dopuszczalna warto wynosi 30,
ale nie powinna przekracza /.
Nawiasy kwadratowe ( ) identyfikuj opcjonalne fragmenty deklaracji typu.
126 Rozdzia 4. Typy kolumn
4.1. Przegld typw dla kolumny
4.1.1. Omwienie typw liczbowych
Poniej znajduje si przegld liczbowych typw dla kolumn. Bardziej szczegowe
informacje mona znale w podrozdziale 4.2. Wymogi dotyczce rozmiaru pamici
potrzebnej do przechowywania kolumn znajduj si w podrozdziale 4.5.
Jeli dla kolumny liczbowej zostanie okrelony atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UN1S1ONlD.
Naley uwaa podczas odejmowania dwch wartoci liczbowych, z ktrych jedna ma
typ UN1S1ONlD. Uzyskany wynik bdzie rwnie tego typu! patrz podrozdzia 5.7.
T1NY1NT/) UNS1ONlD /lRO|1||
Bardzo maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od `8
do `/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do bb.
B1T, BOO|, BOO|lAN
To s synonimy T1NY1NT`). Synonim BOO|lAN zosta dodany w MySQL 4.1.0.
Warto zerowa to inaczej fasz. Wartoci niezerowe traktowane s jako prawda.
W przyszoci wprowadzona zostanie pena, zgodna ze standardem SQL
obsuga typu boolowskiego.
SMA||1NT/) UNS1ONlD /lRO|1||
Maa liczba cakowita. Dla liczb ze znakiem zakres wynosi od o/68
do o/6/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0 do 6bbob.
MlD1UM1NT/) UNS1ONlD /lRO|1||
rednia liczba cakowita. Dla liczb ze znakiem zakres wynosi od 8o88608
do 8o8860/. W przypadku liczb bez znaku zakres obejmuje wartoci od 0
do `6///`b.
1NT/) UNS1ONlD /lRO|1||
Standardowa liczba cakowita. Dla liczb ze znakiem zakres wynosi
od `4/48o648 do `4/48o64/. W przypadku liczb bez znaku zakres
obejmuje wartoci od 0 do 49496/9b.
1NTlOlR/) UNS1ONlD /lRO|1||
Jest to synonim dla typu 1NT.
B1O1NT/) UNS1ONlD /lRO|1||
Dua liczba cakowita. Dla liczb ze znakiem zakres wynosi
od 9oo/0o68b4//b808 do 9oo/0o68b4//b80/. W przypadku liczb
bez znaku zakres obejmuje wartoci od 0 do `8446/440/o/09bb`6`b.
4.1. Przegld typw dla kolumny 127
Oto kilka spraw, o ktrych naley wiedzie odnonie kolumn typu B1O1NT:
Wszystkie obliczenia wykonywane s przy uyciu wartoci typu B1O1NT
lub DOUB|l ze znakiem. Oznacza to, e duych liczb cakowitych bez
znaku, wikszych ni 9oo/0o68b4//b80/ (63 bity), mona uywa tylko
z funkcjami bitowymi! Niezastosowanie si do tej zasady moe doprowadzi
do uzyskania w wyniku liczby, ktrej kilka ostatnich cyfr jest bdnych
z powodu bdw w zaokrglaniu podczas konwersji wartoci B1O1NT
na DOUB|l.
MySQL 4.0 potrafi obsugiwa B1O1NT w nastpujcych przypadkach:
Podczas wykorzystywania liczb cakowitych do przechowywania
duych wartoci bez znaku w kolumnie typu B1O1NT.
W M1NPC\YCAMQN) lub MAXPC\YCAMQN), gdzie PC\YCAMQN odnosi si
do kolumny B1O1NT.
Podczas korzystania z operatorw (midzy innymi , , *), gdy oba
argumenty s liczbami cakowitymi.
Zawsze istnieje moliwo zapisania w kolumnie B1O1NT dokadnej wartoci
liczby cakowitej. Wystarczy zapisa j przy uyciu acucha. W takim
przypadku zostanie dokonana konwersja acucha na liczb; konwersja
nie bdzie wymaga poredniego etapu przeksztacajcego liczb na jej
odpowiednik o podwjnej precyzji.
Podczas korzystania z operatorw , i * stosowana jest arytmetyka
B1O1NT, jeli oba argumenty maj warto liczby cakowitej! To oznacza,
e pomnoenie dwch duych liczb cakowitych (lub wynikw funkcji,
ktra zwraca liczby cakowite) moe spowodowa nieoczekiwane
rezultaty, jeli wynik przekroczy liczb 9oo/0o68b4//b80/.
||OATR) UNS1ONlD /lRO|1||
Liczba zmiennoprzecinkowa. Parametr R oznacza precyzj i moe przyjmowa
warto od 0 do 14 dla liczb zmiennoprzecinkowych o dokadnoci do jednego
znaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokadnoci do dwch
znakw. To przypomina opisane poniej typy ||OAT i DOUB|l. Typ ||OATR)
ma ten sam zakres, jaki posiadaj odpowiadajce mu typy ||OAT i DOUB|l,
ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wywietlania
i liczba miejsc po przecinku.
Od wersji 3.23 MySQL jest to prawdziwa warto zmiennoprzecinkowa.
W wersjach wczeniejszych liczba typu ||OATR) bya zawsze liczb o dwch
miejscach po przecinku.
Ta skadnia zostaa dodana w celu zachowania zgodnoci ze standardem ODBC.
Stosowanie typu ||OAT moe spowodowa wystpienie pewnych
nieoczekiwanych problemw, poniewa wszystkie obliczenia w MySQL
s wykonywane z podwjn precyzj patrz punkt A.1.7).
||OAT/, &) UNS1ONlD /lRO|1||
128 Rozdzia 4. Typy kolumn
Maa liczba zmiennoprzecinkowa (o dokadnoci do jednego znaku). Liczba
ta moe przyj wartoci: od o408o466lo8 do ``/b494ob`lo8, 0,
i od ``/b494ob`lo8 do o408o466lo8. Jeli podany jest atrybut UN1S1ONlD,
niedozwolone s wartoci ujemne. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ ||OAT bez argumentw
lub typ ||OATR) (gdzie Rjest liczb z zakresu od 0 do 24) oznacza liczb
zmiennoprzecinkow o pojedynczej precyzji.
DOUB|l/, &) UNS1ONlD /lRO|1||
Standardowa liczba zmiennoprzecinkowa (o dokadnoci do dwch
znakw). Liczba ta moe przyj wartoci: od `/9/69o`o486o`b/lo08
do b0/o8b8b0/0`4lo08, 0, i od b0/o8b8b0/0`4lo08
do `/9/69o`o486o`b/lo08. Jeli podany jest atrybut UN1S1ONlD, wartoci
ujemne s niedozwolone. Parametr /definiuje maksymaln szeroko
wywietlanej liczby, a & liczb miejsc po przecinku. Typ DOUB|l
bez argumentw lub ||OATR) (gdzie R jest liczb z zakresu od 25 do 53)
oznacza liczb zmiennoprzecinkow o podwjnej precyzji.
DOUB|l PRlC1S1ON/, &) UNS1ONlD /lRO|1||
RlA|/, &) UNS1ONlD /lRO|1||
S to synonimy DOUB|l. Wyjtek: Jeli dla parametru s;_cce serwera
wczono opcj RlA|_AS_||OAT, synonimem ||OAT jest RlA|, a nie DOUB|l.
DlC1MA|/, &) UNS1ONlD /lRO|1||
Niezapakowana liczba staoprzecinkowa. Zachowanie kolumny tego typu
przypomina kolumn typu CHAR. Niezapakowana oznacza, e liczba jest
przechowywana w postaci acucha przy uyciu jednego znaku na kad cyfr
wartoci. Parametr / definiuje maksymaln liczb cyfr, a & liczb miejsc
po przecinku. W parametrze / nie s brane pod uwag: kropka dziesitna
(odpowiadajca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak ,
cho jest dla nich zarezerwowane miejsce. Wartoci nie maj miejsc
po przecinku lub czci uamkowych, jeli & jest rwne 0. Maksymalny zakres
wartoci typu DlC1MA| jest taki sam, jak dla typu DOUB|l, ale rzeczywisty zakres
danej kolumny DlC1MA| moe by ograniczony przez wybr argumentw / i &.
Jeli podany jest atrybut UN1S1ONlD, wartoci ujemne s niedozwolone.
W przypadku braku argumentu &, domyln wartoci jest 0. Jeli pominity
jest parametr /, domyln wartoci jest 10.
W wersjach poprzedzajcych MySQL 3.23 argument / musi by wystarczajco
duy, by zawiera obszar potrzebny dla znaku i kropki dziesitnej.
DlC/,&) UNS1ONlD /lRO|1||
NUMlR1C/,&) UNS1ONlD /lRO|1||
|1XlD/, &) UNS1ONlD /lRO|1||
S to synonimy typu DlC1MA|.
W MySQL 4.1.0 dodano synonim |1XlD w celu osignicia kompatybilnoci
z innymi serwerami.
4.1. Przegld typw dla kolumny 129
4.1.2. Przegld typw zwizanych z dat i czasem
Poniej znajduje si podsumowanie typw kolumn przeznaczonych dla czasu i daty.
Dodatkowe informacje na ten temat mona znale w podrozdziale 4.3. Wymogi do-
tyczce pamici potrzebnej do przechowywania danych w kolumnach zostay podane
w podrozdziale 4.5.
DATl
Data. Obsugiwany zakres obejmuje daty od ``0000`0`` do `9999`o``.
W MySQL wartoci DATl wywietlane s w formacie `RRRRMMDD`, ale mona
przypisywa wartoci do kolumn DATl przy uyciu acuchw lub liczb.
DATlT1Ml
Kombinacja daty i czasu. Obsugiwany zakres obejmuje wartoci
od ``0000`0` 000000` do `9999`o` ob9b9`. W MySQL wartoci
DATlT1Ml wywietlane s w formacie `RRRRMMDD OOMMSS`, ale mona
przypisywa wartoci do kolumn DATlT1Ml przy uyciu acuchw lub liczb.
T1MlSTAMP/)
Znacznik czasu. Obsugiwany zakres rozpoczyna si od daty ``9/00`0``
i siga roku 0o/.
Kolumna typu T1MlSTAMP przydaje si do rejestracji daty i godziny operacji
wstawiania lub aktualizacji. Pierwszej kolumnie T1MlSTAMP w tabeli
automatycznie przypisywana jest data i czas ostatniej operacji, jeli tylko tych
wartoci nie wprowadzi rcznie uytkownik. Dowolnej kolumnie T1MlSTAMP
mona rwnie przypisa biec dat i godzin, wpisujc do niej warto NU||.
Od MySQL 4.1 wartoci T1MlSTAMP s zwracane w postaci acuchw
w formacie `RRRRMMDD OOMMSS`. Aby uzyska warto w postaci liczby,
naley doda do kolumn tego typu 0. Inne szerokoci wywietlania
znacznika czasu nie s obsugiwane.
W wersjach poprzedzajcych MySQL 4.1 wartoci T1MlSTAMP s wywietlane
w formacie RRRRMMDDOOMMSS, RRMMDDOOMMSS, RRRRMMDD lub RRMMDD w zalenoci
od tego, czy parametr / jest rwny 14 (albo go brak), 12, 8 lub 6. Mona jednak
przypisywa wartoci do kolumn T1MlSTAMP przy uyciu acuchw lub liczb.
Argument / wpywa tylko na sposb wywietlania kolumny T1MlSTAMP, a nie
na jej przechowywanie. Wartoci kolumny s zawsze zapisywane w czterech
bajtach. W MySQL od wersji 4.0.12 pojawia si opcja ne., dziki ktrej
mona zmieni dziaanie serwera, upodabniajc je do MySQL 4.1.
Naley odnotowa, e kolumny T1MlSTAMP/), gdzie /jest rwne 8 lub 14,
s traktowane jako liczby, natomiast reszta kolumn T1MlSTAMP/) jest
traktowana jako acuchy. Jest to rodzaj gwarancji, e uytkownik bdzie
mg wiarygodnie usuwa i przywraca tabele tego typu.
T1Ml
Godzina. Obsugiwany zakres obejmuje wartoci od `8o8b9b9`
do ` 8o8b9b9`. W MySQL wartoci T1Ml wywietlane s w formacie
` OOMMSS`, ale mona przypisa wartoci do kolumn T1Ml przy uyciu
zarwno acuchw, jak i liczb.
130 Rozdzia 4. Typy kolumn
YlAR|4)
Rok w formacie dwu- lub czterocyfrowym. Domylnym formatem jest rok
zapisany za pomoc czterech cyfr. W tym formacie dostpne wartoci nale
do przedziau od `90` do `bb oraz 0. W formacie dwucyfrowym wartoci
dopuszczalne to liczby z zakresu od /0 do 69, ktre reprezentuj daty od roku
1970 do 2069. W MySQL wartoci YlAR wywietlane s w formacie RRRR,
ale mona przypisa wartoci do kolumn YlAR przy uyciu tak acuchw,
jak i liczb. Typ YlAR jest niedostpny dla wersji wczeniejszych ni MySQL 3.22.
4.1.3. Przegld typw acuchowych
Poniej znajduje si przegld typw acuchowych. Dodatkowe informacje mona
znale w podrozdziale 4.4. Wymogi dotyczce pamici potrzebnej do przechowywa-
nia danych w kolumnach zostay podane w podrozdziale 4.5.
W niektrych przypadkach MySQL moe zmieni kolumn typu acuchowego na typ,
ktry bdzie si rni od zadeklarowanego w instrukcji CRlATl TAB|l lub A|TlR TAB|l.
Wicej informacji na ten temat znajduje si w podpunkcie 6.2.5.2.
Od wersji 4.1 w MySQL pojawia si zmiana, ktra wpywa na wiele typw kolumn typu
acuchowego. Definicja kolumn typu znakowego moe zawiera atrybut CHARACTlR
SlT, ktry okrela zestaw znakw i opcjonalnie porzdek sortowania. Dotyczy to typw
CHAR, VARCHAR, rnych typw TlXT oraz lNUM i SlT, na przykad:
CRF/TF T/B|F !

|1 C'/R0| C'/R/CTFR SFT u!f8


| C'/R0| C'/R/CTFR SFT !a!:n1 CJ||/TF !a!:n1o:n
|,
Ta definicja tabeli tworzy kolumn o nazwie ` z zestawem znakw u''8 i z domyl-
nym sortowaniem dla tego zestawu znakw oraz kolumn z zestawem znakw .'n`
i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwag
wielko liter.
Sortowanie i porwnywanie kolumn typu znakowego jest wykonywane na podstawie
zestawu znakw, ktry jest przypisany do kolumny. W wersjach poprzedzajcych
MySQL 4.1 wspomniane operacje bazuj na porzdku sortowania zestawu znakw
serwera. Dla kolumn CHAR i VARCHAR mona zadeklarowa kolumn z atrybutem B1NARY,
aby spowodowa sortowanie i porwnywanie rozrniajce wielko liter przy uyciu
wartoci liczbowych kodu, a nie porzdkowania leksykograficznego.
Wicej szczegw na ten temat mona znale w rozdziale 3.
Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje dugoci przechowywanych
danych w definicjach kolumn typu znakowego w znakach (w wersjach wczeniejszych
interpretowanie wykonywane byo w bajtach).
Oto dostpne w MySQL typy acuchowe:
4.1. Przegld typw dla kolumny 131
NAT1ONA| CHAR /) B1NARY | ASC11 | UN1CODl
acuch o staej dugoci, ktry jest zawsze w celu przechowania dopeniany
po prawej stronie odpowiedni liczb spacji. Parametr / reprezentuje dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach poprzedzajcych
MySQL 3.23 by to przedzia od 1 do 255).
Kocowe spacje zostaj usunite w czasie pobierania wartoci CHAR.
Od MySQL 4.1.0 kolumna CHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto CHARb00) zostanie na przykad przeksztacona
na typ TlXT, za CHAR00000) na typ MlD1UMTlXT. Jest to spowodowane
wymogami kompatybilnoci. Jednak taka konwersja wpywa na kolumny,
ktre staj si kolumnami zmiennej dugoci, a take powoduje usuwanie
kocowych spacji.
Sowo kluczowe CHAR to skrt od CHARACTlR. Typ NAT1ONA| CHAR
(lub odpowiadajca mu forma skrcona NCHAR) to naleca do standardu SQL
metoda definiowania, opierajca si na zaoeniu, e kolumna CHAR powinna
uy domylnego zestawu znakw. W MYSQL to ustawienie jest domylne.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
Od MySQL 4.1.0 mona okrela atrybut ASC11. Powoduje on przypisanie
do kolumny typu CHAR zestawu znakw .'n`.
Od wersji 4.1.1 MySQL mona take podawa atrybut UN1CODl. Powoduje on
przypisanie do kolumny CHAR zestawu znakw ucs.
MySQL pozwala tworzy kolumn typu CHAR0). Jest to szczeglnie przydatne,
w sytuacjach gdy zachodzi potrzeba osignicia zgodnoci z jakimi
starymi aplikacjami, ktre zale od istnienia kolumny, cho samej wartoci
w rzeczywistoci nie uywaj. Jest to rwnie praktyczne, gdy potrzebna jest
kolumna, ktra moe przyj tylko dwie wartoci: kolumna CHAR0), jeli
nie zostanie zdeklarowana jako NOT NU||, zajmuje tylko jeden bit i moe
przybiera tylko wartoci NU|| i `` (pusty acuch).
CHAR
Jest to synonim typu CHAR`).
NAT1ONA| VARCHAR /) B1NARY
acuch o zmiennej dugoci. Parametr / reprezentuje maksymaln dugo
kolumny. Zakres / wynosi od 0 do 255 znakw (w wersjach wczeniejszych
od MySQL 4.0.2 wynosi od 1 do 255).
Kocowe spacje zostaj usunite w momencie zapisywania wartoci VARCHAR, co
nie jest zgodne ze specyfikacj standardu SQL.
132 Rozdzia 4. Typy kolumn
Od MySQL 4.1.0 kolumna VARCHAR o specyfikacji dugoci przekraczajcej 255
zostanie przeksztacona na najmniejszy typ TlXT, ktry moe przechowywa
wartoci takiej dugoci. Warto VARCHARb00) zostanie na przykad
przeksztacona na typ TlXT, natomiast VARCHAR00000) na typ MlD1UMTlXT.
Jest to spowodowane wymogami kompatybilnoci. Taka konwersja wpywa
jednak na usuwanie kocowych spacji.
Sowo kluczowe VARCHAR jest skrtem od sw CHARACTlR VARY1NO.
Atrybut B1NARY powoduje rozrnianie wielkoci liter podczas operacji
sortowania i porwnywania.
T1NYB|OB, T1NYTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 255 (2
8
1) znakw.
B|OB, TlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 65 535 (2
16
1)
znakw.
MlD1UMB|OB, MlD1UMTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 16 777 215 (2
24
1)
znakw.
|ONOB|OB, |ONOTlXT
Kolumna B|OB lub TlXT z maksymaln dugoci wynoszc 4 294 967 295
lub 4 GB (2
32
1) znakw. Do wersji 3.23 MySQL protok klient-serwer
i tabele M,1SAM miay naoone ograniczenie do 16 MB na pakiet komunikacyjny
i wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna dugo kolumn
|ONOB|OB lub |ONOTlXT zaley od skonfigurowanego maksymalnego rozmiaru
pakietu w protokole klient-serwer i dostpnej pamici.
lNUM`YCTVQ`,`YCTVQ`,)
Wyliczenie. Obiekt acuchowy, ktry moe skada si tylko z jednej, wybranej
z listy, wartoci: `YCTVQ`, `YCTVQ`, , NU|| lub specjalnej wartoci
bdu ``. Kolumna lNUM moe zawiera maksymalnie do 65 535 rnych
wartoci. Elementy lNUM s reprezentowane wewntrznie jako liczby cakowite.
SlT`YCTVQ`,`YCTVQ`,)
Zbir. Obiekt acuchowy, ktry moe skada si dowolnej liczby wartoci,
z ktrych kada musi pochodzi z listy wartoci `YCTVQ`, `YCTVQ`, .
Kolumna SlT moe liczy maksymalnie 64 elementy. Wartoci SlT
s reprezentowane wewntrznie jako liczby cakowite.
4.2. Typy liczbowe
MySQL obsuguje wszystkie liczbowe typy danych standardu SQL. S to dokadne
typy liczbowe danych (1NTlOlR, SMA||1NT, DlC1MA| i NUMlR1C), jak rwnie przyblione
(||OAT, RlA| i DOUB|l PRlC1S1ON). Sowo kluczowe 1NT jest synonimem dla typu 1NTlOlR,
natomiast sowo kluczowe DlC jest synonimem typu DlC1MA|.
4.2. Typy liczbowe 133
Jako rozszerzenie do standardu SQL, MySQL obsuguje rwnie midzy innymi takie
typy dla liczb cakowitych jak T1NY1NT, MlD1UM1NT i B1O1NT. Zostao to przedstawione
w poniszym zestawieniu.
Typ Bajty
Warto minimalna
(ze znakiem)
Warto maksymalna
(ze znakiem)
TTNYTNT 1 -18 17
SM/||TNT -:7b8 :7b7
MFOTUMTNT : -8:88b08 8:88b07
TNT 4 -14748:b48 14748:b47
BTTNT 8 -9::70:b854775808 9::70:b854775807
MySQL posiada take rozszerzenie suce do opcjonalnego okrelania dla liczby cako-
witej maksymalnej szerokoci wywietlania, ktrej warto podawana jest w nawiasach
po sowie kluczowym nazwy typu (na przykad 1NT4)). Pozwala to z lewej strony uzu-
penia spacjami wywietlane wartoci o szerokoci mniejszej ni szeroko okrelona
dla kolumny.
Szeroko wywietlania nie ogranicza zakresu wartoci, ktre mona przechowywa
w kolumnie, ani te liczby wywietlanych cyfr tych wartoci, ktrych szeroko prze-
kroczy maksimum okrelone dla kolumny.
Jeli wraz z opcjonalnym rozszerzeniem uyty zostanie atrybut /lRO|1||, domylne do-
penianie spacjami zostanie zastpione zerami. Dla kolumny zadeklarowanej na przykad
jako 1NTb) /lRO|1||, warto 4 po pobraniu bdzie miaa posta 00004. Naley zauwa-
y, e w przypadku przechowywania w kolumnie typu liczby cakowitej wartoci, kt-
ra przekracza szeroko wywietlania, moe wystpi problem podczas generowania
przez MySQL tymczasowej tabeli dla pewnych skomplikowanych zcze. W takich
wypadkach zakada si, e dane zmieciy si w oryginalnej szerokoci kolumny.
Wszystkie typy dla liczb cakowitych mog opcjonalnie korzysta z (niestandardowe-
go) atrybutu UNS1ONlD. Warto bez znaku mona stosowa w sytuacjach, gdy chcemy
dopuci w kolumnie tylko liczby nieujemne, ale potrzebujemy wyszej grnej granicy
zakresu liczbowego.
Od MySQL 4.0.2 atrybut UNS1ONlD mona take okrela dla typw zmiennoprzecin-
kowych i staoprzecinkowych. Podobnie jak w przypadku typw dla liczb cakowitych,
atrybut ten zapobiega przechowywaniu w kolumnie wartoci ujemnych. Jednak w prze-
ciwiestwie do typw dla liczb cakowitych grna granica zakresu wartoci kolumny
pozostaje bez zmian.
Jeli dla kolumny liczbowej okrelony zostanie atrybut /lRO|1||, MySQL automatycznie
doda do kolumny atrybut UNS1ONlD.
Typy DlC1MA| i NUMlR1C implementowane s w MySQL jako ten sam typ. Su do
przechowywania wartoci, dla ktrych wane jest zachowanie dokadnoci, takich jak
dane walutowe. Podczas deklarowania kolumny jednego z tych typw mona okreli
(i zazwyczaj si to robi) dokadno oraz skal, na przykad:
pensa OFCTM/|5|
134 Rozdzia 4. Typy kolumn
W tym przykadzie 5 jest dokadnoci, a 2 skal. Dokadno oznacza tutaj precyzyjne
okrelenie liczby przechowywanych dla wartoci znaczcych cyfr dziesitnych, a skala
liczby przechowywanych cyfr po kropce dziesitnej.
MySQL przechowuje wartoci DlC1MA| i NUMlR1C w postaci acuchw, a nie binarnych
liczb zmiennoprzecinkowych. Pozwala to zachowa ich dokadno dziesitn. Kada
cyfra wartoci, kropka dziesitna (jeli skala jest wiksza ni zero) i znak minusa (dla
liczb ujemnych) jest reprezentowany przez jeden znak. Jeli skala ma warto 0, warto-
ci DlC1MA| i NUMlR1C nie zawieraj kropki dziesitnej lub czci uamkowej.
Standard SQL wymaga, by kolumna ,ens_. moga przechowywa wszystkie wartoci
skadajce si z piciu cyfr i dwch miejsc po przecinku. Dlatego w tym przypadku zakres
wartoci, ktre mog by przechowywane w tej kolumnie, to przedzia od 99999 do
99999. Trzeba jednak pamita o dwch sprawach:
Na dodatniej granicy zakresu kolumna moe w rzeczywistoci przechowywa
liczby do 999999. Dla liczb dodatnich MySQL rozszerza grn granic
zakresu, poniewa uywa bajta zarezerwowanego dla znaku.
W wersjach poprzedzajcych MySQL 3.23 kolumny typu DlC1MA| s
przechowywane inaczej i nie mog reprezentowa wszystkich wartoci
wymaganych przez standard SQL. To dlatego, e dla typu DlC1MA|/,&) warto
/ obejmuje bajty dla znaku i kropki dziesitnej. W ten sposb do zakresu
kolumny ,ens_. przed MySQL 3.23 naleayby liczby od 999 do 9999.
W standardzie SQL skadnia DlC1MA|/) jest rwnowana skadni DlC1MA|/,0). Podob-
nie skadnia DlC1MA| jest odpowiednikiem DlC1MA|/,0), jeli dozwolone jest definio-
wanie wartoci /. Od MySQL 3.23.6 obsugiwane s obie formy typw danych DlC1MA|
i NUMlR1C. Warto domylna parametru / wynosi 10. W wersjach poprzedzajcych
3.23.6 konieczne jest wyrane okrelenie obu parametrw / i &.
Maksymalny zakres wartoci DlC1MA| i NUMlR1C jest taki sam jak dla typu DOUB|l, jednak
na rzeczywisty zakres tych kolumn moe wpywa zadeklarowana dla danej kolumny
dokadno lub skala. Jeli kolumna takiego typu ma przypisan warto o liczbie miejsc
po przecinku przekraczajcej zezwalan skal, warto zostaje przeksztacona do tej
skali (zaley to od systemu operacyjnego, ale zazwyczaj jest to przeksztacenie do do-
zwolonej liczby cyfr). Gdy kolumnie DlC1MA| lub NUMlR1C przypisana jest warto, ktra
przekracza zakres wskazany przez okrelon w definicji (lub domyln) dokadno
i skal, MySQL przechowuje warto reprezentujc koniec tego zakresu.
W przypadku typw dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowuje
wartoci o pojedynczej precyzji przy uyciu czterech bajtw, a wartoci o podwjnej
precyzji, wykorzystujc osiem bajtw.
Typ ||OAT suy do reprezentowania przyblionych liczbowych typw danych. Standard
SQL pozwala na opcjonalne deklarowanie dokadnoci (ale nie zakresu wykadnika)
w nawiasach w bitach po sowie kluczowym ||OAT. Implementacja MySQL obsuguje
rwnie t opcjonaln specyfikacj dokadnoci, ale jej warto suy jedynie do okre-
lenia rozmiaru pamici. Dokadno od 0 do 23 powoduje uzyskanie czterobajtowej
kolumny ||OAT o pojedynczej precyzji. Dokadno od 24 do 53 daje w rezultacie omio-
bajtow kolumn DOUB|l o podwjnej precyzji.
4.3. Typy zwizane z dat i czasem 135
Jeli sowo kluczowe ||OAT zostaje uyte do zadeklarowania typu kolumny bez specy-
fikacji dokadnoci, wwczas wartoci przechowywane s przy wykorzystaniu czterech
bajtw. MySQL obsuguje rwnie odmian tej skadni, w ktrej po sowie kluczowym
||OAT znajduj si dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-
ko wywietlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce
dziesitnej (podobnie jak w przypadku typw DlC1MA| i NUMlR1C). Kiedy zachodzi po-
trzeba przechowania w takiej kolumnie liczby, ktrej ilo cyfr po kropce dziesitnej
przekracza okrelony dla kolumny limit, to przechowywana warto zostanie zaokr-
glona, aby usun dodatkowe cyfry.
W standardzie SQL typy RlA| i DOUB|l PRlC1S1ON nie zezwalaj na okrelanie dokad-
noci. Przez MySQL obsugiwany jest wariant skadni, w ktrym po nazwie typu mona
poda w nawiasie dwie liczby. Pierwsza reprezentuje maksymaln szeroko wywie-
tlania, a druga liczb przechowywanych i wywietlanych cyfr po kropce dziesitnej.
Jako rozszerzenie standardu SQL, DOUB|l rozpoznawane jest przez MySQL jako syno-
nim typu DOUB|l PRlC1S1ON. W odrnieniu od nakadanego przez standard wymogu,
by dokadno dla typu RlA| bya mniejsza od okrelonej dla DOUB|l PRlC1S1ON, oba
typy implementowane s przez MySQL jako omiobajtowe wartoci zmiennoprzecin-
kowe o podwjnej precyzji (chyba e dla parametru s;cce serwera wczono opcj
RlA|_AS_||OAT).
Dla uzyskania maksymalnej przenonoci, w kodzie, ktry wymaga przechowywania
przyblionych wartoci danych liczbowych, powinien by uywany typ ||OAT lub DOUB|l
PRlC1S1ON bez okrelania dokadnoci lub liczby miejsc po kropce dziesitnej.
Jeli w kolumnie typu liczbowego ma by przechowywana warto spoza dopuszczalnego
zakresu dla danego typu, warto zostanie przycita do odpowiedniej granicy zakresu
i dopiero w ten sposb uzyskana liczba bdzie przechowana.
Kolumna 1NT ma na przykad zakres od `4/48o648 do `4/48o64/. Gdyby sprbowa
wstawi do niej liczb 9999999999, warto ta zostaaby przycita do dolnego kraca
zakresu i w zamian zachowana liczba `4/48o648. Podobnie, gdyby sprbowa wstawi
liczb 9999999999, warto ta zostaaby przycita do grnego kraca zakresu i w zamian
zachowana liczba `4/48o64/.
Jeli kolumna 1NT ma atrybut UNS1ONlD, wielko zakresu kolumny pozostaje bez zmian,
ale jego krace przesuwaj si, tworzc przedzia od 0 do 49496/9b. Gdyby spr-
bowa przechowa liczby 9999999999 i 9999999999, w kolumnach zostayby zapisane
wartoci 0 i 49496/9b.
Konwersje, spowodowane odcinaniem, s dla instrukcji A|TlR TAB|l, |OAD DATA 1N|1|l,
UPDATl i wielowierszowych 1NSlRT poprzedzane ostrzeeniami.
4.3. Typy zwizane z dat i czasem
Typami, ktre su do reprezentowania wartoci zwizanych z dat i czasem, s DATl
T1Ml, DATl, T1MlSTAMP, T1Ml i YlAR. Wszystkie maj zakres dopuszczalnych wartoci
oraz warto zerow, wykorzystywan w razie podania wartoci niedozwolonej, ktrej
136 Rozdzia 4. Typy kolumn
MySQL nie moe reprezentowa. Typ T1MlSTAMP posiada take opisan w dalszej czci
rozdziau specjaln moliwo automatycznej aktualizacji.
MySQL pozwala przechowywa pewne niekoniecznie poprawne wartoci dat, takie
jak ``999``o``. To dlatego, e sprawdzanie daty naley do czynnoci wykonywanych
przez aplikacj, a nie serwer MySQL. Aby przyspieszy sprawdzanie dat, przez MySQL
weryfikowane jest tylko, czy podany miesic naley do przedziau od 0 do 12, a dzie
do przedziau od 0 do 31. Zakresy te zawieraj zero, poniewa MySQL pozwala na
przechowywanie w kolumnie DATl i DATlT1Ml danych, w ktrych dzie lub miesic jest
zerem. Jest to szczeglnie praktyczne dla aplikacji, za pomoc ktrych zapisywana jest
data urodzin, chocia data taka nie jest dokadnie znana. W takim przypadku wystarczy
zapisa dat w postaci ``9990000` lub ``9990`00`. Przechowujc dat zapisan
w ten sposb, nie naley oczekiwa uzyskania poprawnych wynikw z takimi funkcja-
mi, jak DATl_SUB) lub DATl_ADD, ktre wymagaj podania penych dat.
Oto oglne warunki, o ktrych warto pamita, pracujc z typami daty i czasu:
Wartoci dla danego typu daty lub czasu pobierane s przez MySQL
w standardowym formacie wyjciowym, ale podejmowana jest prba
interpretacji rnych formatw dla wartoci wejciowych, dostarczanych
przez uytkownika (na przykad gdy uytkownik poda warto do przypisania
do typu zwizanego z dat lub godzin lub do porwnania z nim). Obsugiwane
s tylko formaty opisane w poniszych podrozdziaach. Oczekuje si
od uytkownika dostarczania poprawnych wartoci. Uycie wartoci w innych
formatach moe spowodowa pojawienie si nieoczekiwanych wynikw.
Daty zawierajce dwucyfrowe wartoci dla roku s niejednoznaczne, poniewa
nie jest znany wiek. Takie dwucyfrowe wartoci interpretowane s przez
MySQL za pomoc nastpujcych zasad:
Wartoci roku w zakresie od 0069 s przeksztacane na lata 000069.
Wartoci roku w zakresie /099 s przeksztacane na lata `9/0`999.
Cho wartoci mog by interpretowane przez MySQL w wielu formatach,
daty musz by zawsze podawane w kolejnoci rok-miesic-dzie
(na przykad `980904`), a nie w powszechnie uywanej postaci
miesic-dzie-rok lub dzie-miesic-rok (na przykad `090498`, `040998`).
MySQL powoduje automatyczne przeksztacenie wartoci typu daty lub czasu
na liczb, jeli s one uywane w kontekcie liczbowym i na odwrt.
Kiedy MySQL napotka warto dla typu zwizanego z dat lub czasem, ktra
wychodzi poza zakres lub jest w inny sposb niedopuszczalna (w sposb
opisany na pocztku tego punktu), przeksztaca t warto na warto zero
danego typu. Wyjtkiem s wychodzce poza zakres wartoci T1Ml, ktre s
przycinane do odpowiedniej wartoci stanowicej granic zakresu tego typu.
Ponisze zestawienie przedstawia formaty wartoci zerowej dla kadego typu:
4.3. Typy zwizane z dat i czasem 137
Typ kolumny Warto zerowa
O/TFTTMF '0000-00-00 000000'
O/TF '0000-00-00'
TTMFST/MP 00000000000000
TTMF '000000'
YF/R 0000
Wartoci zerowe s specjalne, ale mona je przechowywa lub odwoywa
si do nich w sposb jawny, uywajc wartoci przedstawionych w tabeli.
Mona rwnie wykonywa to, korzystajc z wartoci `0` lub 0, co jest
w sumie atwiejsze do zapisania.
Zerowe wartoci daty lub czasu, stosowane w interfejsie Connector/ODBC,
zostaj automatycznie przeksztacone do wartoci NU|| w interfejsie Connector/
ODBC 2.50.12, poniewa ODBC nie potrafi obsugiwa takich wartoci.
4.3.1. Typy DATETIME, DATE i TIMESTAMP
Typy DATlT1Ml, DATl i T1MlSTAMP s ze sob zwizane. W tym punkcie opisana zostanie
ich charakterystyka, a take omwione bd podobiestwa i rnice midzy nimi.
Typ DATlT1Ml stosuje si, gdy potrzebne s wartoci skadajce si z informacji o dacie
i czasie. Wartoci DATlT1Ml pobierane s i wywietlane przez MySQL w formacie `RRRR
MMDD OOMMSS`. Obsugiwany zakres obejmuje wartoci od ``0000`0` 000000`
do `9999`o` ob9b9` (obsugiwany oznacza, e cho wartoci dla dat wczeniej-
szych mog by prawidowo zinterpretowane, nie ma gwarancji, e tak bdzie).
Typ DATl stosuje si, gdy potrzebna jest tylko warto daty bez czci podajcej godzin.
Wartoci DATl wywietlane s przez MySQL w formacie `RRRRMMDD`. Obsugiwany
zakres obejmuje daty od ``0000`0`` do `9999`o``.
Waciwoci typu kolumny T1MlSTAMP rni si w zalenoci od wersji MySQL i trybu
SQL, w ktrym dziaa serwer. Zostay one podane w dalszej czci tego punktu.
Wartoci DATlT1Ml, DATl i T1MlSTAMP mona deklarowa za pomoc dowolnego z popu-
larnych zestaww formatw:
Jako acuch w formacie `RRRRMMDD OOMMSS` lub `RRMMDD OOMMSS`.
Dozwolona jest nieco mniej rygorystyczna skadnia: znakiem rozdzielajcym
elementy daty i czasu moe by dowolny znak interpunkcyjny. Rwnowane
bd na przykad zapisy `98`o` ``o04b`, `98`o` ``o04b`,
`98.`.o` ``*o0*4b` i `98`o` ``o04b`.
Jako acuch w formacie `RRRRMMDD` lub `RRMMDD`. I tu dozwolona jest
mniej rygorystyczna skadnia, na przykad `98`o``, `98`o``, `98.`.o``
i `98`o``.
138 Rozdzia 4. Typy kolumn
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDDOOMMSS` lub `RRMMDDOOMMSS`, jeli tylko dany cig odzwierciedla
rozsdn dat. Zapisy ``99/0bo09`b8` i `9/0bo09`b8` interpretowane s
na przykad jako ``99/0bo 09`b8`, ale `9/```90`b` jest wartoci
niedozwolon (dziwna liczba w elemencie reprezentujcym minuty) i zostanie
przeksztacona do wartoci `00000000 000000`.
Jako acuch bez znakw rozdzielajcych elementy daty w formacie
`RRRRMMDD` lub `RRMMDD`, jeli tylko dany cig odzwierciedla rozsdn dat.
Na przykad ``99/0bo` i `9/0bo` s interpretowane jako ``99/0bo`,
ale `9/`oo` jest wartoci niedozwolon (dziwny numer miesica i dnia)
i zostanie przeksztacona do wartoci `00000000`.
Jako liczba w formacie RRRRMMDDOOMMSS lub RRMMDDOOMMSS, jeli tylko dany
cig odzwierciedla rozsdn dat. Na przykad `98o090b`o800 i 8o090b`o800
s interpretowane jako ``98o090b `o800`.
Jako liczba w formacie RRRRMMDD lub RRMMDD, jeli tylko dany cig
odzwierciedla rozsdn dat. Na przykad `98o090b i 8o090b s interpretowane
jako ``98o090b`.
Jako wynik funkcji, ktra zwraca warto akceptowan przez typy DATlT1Ml,
DATl i T1MlSTAMP, na przykad NOw) lub CURRlNT_DATl.
Niedozwolone wartoci DATlT1Ml, DATl i T1MlSTAMP s przeksztacane na wartoci zerowe
odpowiedniego typu (`00000000 000000`, `00000000` lub 00000000000000).
W przypadku wartoci okrelonych jako acuchy, ktre zawieraj znaki rozdzielaj-
ce poszczeglne czci daty, nie ma koniecznoci podawania dwch cyfr dla wartoci
miesica i dnia nie przekraczajcych 10. ``9/969` jest tym samym, czym jest ``9/9
0609`. Podobnie dla wartoci okrelanych jako acuchy ze znakami rozdzielajcymi
czci godziny, nie ma koniecznoci podawania dwch cyfr dla wartoci godziny, minuty
i sekundy mniejszych od 10. ``9/9`0o0 `o` jest tym samym, czym jest ``9/9`0
o0 0`00o`.
Wartoci zadeklarowane jako liczby powinny mie dugo 6, 8, 12 i 14 cyfr. Jeli liczba
skada si z 8 lub 14 cyfr, zakada si, e jest w formacie RRRRMMDD i RRRRMMDDOOMMSS
oraz e rok jest reprezentowany przez pierwsze cztery cyfry. Jeli liczba skada si z 6
lub 12 cyfr, zakada si, e jest w formacie RRMMDD i RRMMDDOOMMSS i e rok reprezentuj
pierwsze dwie cyfry. Liczby skadajce si z innej liczby cyfr interpretuje si, jakby
zostay uzupenione pocztkowymi zerami do najbliszej dugoci.
Wartoci okrelone jako acuchy bez znakw rozdzielajcych czci daty lub godziny
s interpretowane z wykorzystaniem ich dugoci w sposb nastpujcy: jeli acuch
skada si z 8 lub 14 znakw, zakada si, e rok reprezentuj pierwsze cztery cyfry.
W przeciwnym razie zakada si, ze rok zosta podany w postaci dwucyfrowej. acuch
jest interpretowany od lewej do prawej. Najpierw szukana jest warto roku, miesica,
dnia, godziny, minuty i sekundy dla jak najwikszej liczby elementw obecnych w cigu.
To oznacza, e nie naley uywa acuchw zawierajcych mniej ni 6 znakw. Poda-
nie na przykad acucha `990o`, ktry w zamyle mia reprezentowa marzec 1999 roku,
spowoduje, e do tabeli zostanie przez MySQL wstawiona warto zerowa. Mimo e
4.3. Typy zwizane z dat i czasem 139
wartoci roku i miesica s przechowywane w postaci liczb 99 i 0o, brakuje zupenie
czci odnoszcej si do dnia, dlatego nie jest to poprawna warto. Jednak poczwszy
od MySQL 3.23 uytkownik moe brakujce czci miesica i dnia zdefiniowa w spo-
sb jawny jako zero. Mona na przykad uy wartoci `990o00`, aby wstawi warto
``9990o00`.
Istnieje pewna moliwo przypisywania wartoci jednego typu danych do obiektu
o innym typie. Moe to jednak prowadzi do pewnych zmian w wartoci lub do utraty
danych:
Jeli obiektom DATlT1Ml i T1MlSTAMP przypisze si warto DATl, cz wartoci
wyjciowej, zwizana z czasem, wynosi bdzie `000000`, poniewa
warto DATl nie zawiera adnych informacji o czasie.
Jeli obiektowi DATl przypisze si warto DATlT1Ml lub T1MlSTAMP, cz
wartoci wyjciowej, dotyczca czasu, zostanie usunita, poniewa typ DATA
nie przechowuje adnych informacji o czasie.
Naley pamita, e cho wartoci DATlT1Ml, DATl i T1MlSTAMP mona okrela
przy uyciu tego samego zestawu formatw, nie wszystkie typy maj ten
sam zakres wartoci. Na przykad wartoci T1MlSTAMP nie mog by datami
wczeniejszymi ni rok `9/0 lub starszymi ni rok 0o/. To oznacza, e data
taka jak ``9680`0``, cho dopuszczalna jako warto DATlT1Ml i DATl,
nie jest poprawn wartoci T1MlSTAMP i zostanie przeksztacona na 0
w razie przypisania do takiego obiektu.
Podczas okrelania wartoci daty naley zapozna si z pewnymi puapkami:
Uproszczony format, dozwolony dla wartoci deklarowanych jako acuchy,
moe by nieco mylcy. Warto ``0```` moe na przykad z powodu
uytego znaku oddzielajcego poszczeglne elementy `` przypomina
godzin, jednak uyta w kontekcie daty zostanie zinterpretowana jako rok
`0`0````. Warto ``04b`b` zostanie przeksztacona na `00000000`,
poniewa `4b` nie jest poprawnie zapisanym miesicem.
Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawnoci daty:
zakres dla roku, miesica i dnia to odpowiednio od 1000 do 9999, od 00 do 12
i od 00 do 31. Kada data, zawierajca czci wychodzce poza te zakresy,
podlega przeksztaceniu na `00000000`. Naley jednak pamita, e to nie
zapobiegnie przechowywaniu takiej niepoprawnej daty, jak `0004o``.
Poprawno daty naley sprawdzi w aplikacji.
Daty, zawierajce wartoci roku w postaci dwucyfrowej, s niejednoznaczne
z powodu braku informacji o wieku. Interpretowane s przez MySQL
w nastpujcy sposb:
Wartoci reprezentujce rok w zakresie od 0069 zostaj przeksztacone
na rok 000069.
Wartoci reprezentujce rok w zakresie od /099 zostaj przeksztacone
na rok `9/0`999.
140 Rozdzia 4. Typy kolumn
4.3.1.1. Waciwoci TIMESTAMP przed wersj 4.1 MySQL
Typ T1MlSTAMP mona wykorzysta do automatycznego oznaczania biec dat i czasem
operacji 1NSlRT i UPDATl. Jeli tabela zawiera wiele kolumn T1MlSTAMP, automatycznie
aktualizowana jest tylko pierwsza.
Automatyczna aktualizacja pierwszej kolumny T1MlSTAMP w tabeli jest wykonywana,
gdy speniony jest dowolny z poniszych warunkw:
Kolumna zostaje jawnie zadeklarowana jako NU||.
Kolumna nie jest jawnie okrelona w instrukcji 1NSlRT lub |OAD DATA 1N|1|l.
Kolumna nie jest jawnie okrelona w instrukcji UPDATl, a w jakiej innej
kolumnie zmieniana jest warto. Jeeli aktualizacja przypisze kolumnie
warto, ktr ta ju zawiera, kolumna T1MlSTAMP nie bdzie aktualizowana.
Jeli kolumnie zostanie przypisana jej bieca warto, aktualizacja zostanie
przez MySQL zignorowana z powodw wydajnociowych.
Biec dat i godzin mona przypisywa nie tylko pierwszej kolumnie T1MlSTAMP.
Aby wpisa je do innych kolumn tego typu, wystarczy przypisa kolumnie warto
NU|| lub NOw).
Dowolnej kolumnie T1MlSTAMP mona jawnie przypisa warto inn ni bieca data
i czas. Dotyczy to nawet pierwszej kolumny T1MlSTAMP. Jest to przydatne, w sytuacji
gdy na przykad chcemy przypisa T1MlSTAMP biec dat i czasy w momencie tworze-
nia rekordu, ale tak, by informacja ta nie bya ju pniej zmieniana:
Naley podczas tworzenia rekordu zezwoli MySQL na przypisanie kolumnie
wartoci. To spowoduje zainicjowanie jej z biec dat i czasem.
Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, naley
przypisa kolumnie T1MlSTAMP w sposb jawny biec warto znacznika czasu:
UPO/TF PC\YCAVCDGNK
SFT MQNAVKOGUVCOR MQNAVKOGUVCOR
KPPCAMQN PQYCAYCTVQ
KPPCAMQN PQYCAYCTVQ
Innym sposobem utworzenia kolumny, w ktrej rejestrowany bdzie czas utworzenia
rekordu, jest przygotowanie kolumny DATlT1Ml, inicjalizowanej za pomoc funkcji NOw)
w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-
nie jej bez zmian.
Zakres obejmowany przez wartoci T1MlSTAMP rozpoczyna si od roku 1970 i siga do
roku 2037 z dokadnoci co do jednej sekundy. Wartoci wywietlane s jako liczby.
Format, w ktrym przez MySQL pobierane s i wywietlane wartoci T1MlSTAMP, zaley
od maksymalnej wywietlanej liczby cyfr zostao to przedstawione w poniszym
zestawieniu. Peny format typu T1MlSTAMP liczy 14 cyfr, ale takie kolumny mona take
tworzy z mniejszym rozmiarem wywietlania:
4.3. Typy zwizane z dat i czasem 141
Specyfikacja typu Format wywietlania
TTMFST/MP14| RRRRMMOOMMSS
TTMFST/MP1| RRMMOOMMSS
TTMFST/MP10| RRMMOOMM
TTMFST/MP8| RRRRMMOO
TTMFST/MPb| RRMMOO
TTMFST/MP4| RRMM
TTMFST/MP| RR
Rozmiar przechowywanych wartoci wszystkich kolumn T1MlSTAMP jest ten sam bez
wzgldu na liczb wywietlanych cyfr. Najbardziej popularnymi rozmiarami wywietlania
s 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje take moliwo okrelenia dowolnej
maksymalnej liczby wywietlanych cyfr, ale w przypadku wartoci 0 lub wartoci prze-
kraczajcej 14 kolumna zostanie potraktowana jako T1MlSTAMP`4). Nieparzyste warto-
ci // w zakresie od 1 do 13 traktowane s jako wysza o jeden liczba parzysta.
Kolumny T1MlSTAMP przechowuj poprawne wartoci z zastosowaniem penej dokad-
noci, z ktr warto zostaa zadeklarowana, bez wzgldu na rozmiar wywietlania.
Prowadzi to do kilku nastpstw:
Naley zawsze deklarowa rok, miesic i dzie, nawet gdy kolumna jest typu
T1MlSTAMP4) lub T1MlSTAMP). W przeciwnym razie warto nie bdzie
poprawn dat i przechowane zostanie 0.
Uycie instrukcji A|TlR TAB|l do poszerzenia zbyt wskiej kolumny T1MlSTAMP
spowoduje wywietlenie poprzednio ukrytych informacji.
Podobnie, zwenie kolumny T1MlSTAMP nie spowoduje utraty informacji.
Po prostu mniej informacji bdzie wywietlanych.
Mimo e wartoci T1MlSTAMP s przechowywane z pen dokadnoci, jedyn
funkcj, ktrej dziaanie bezporednio dotyczy faktycznie przechowywanych
wartoci, jest UN1X_T1MlSTAMP). Inne funkcje operuj na sformatowanych
wartociach odczytanych. Oznacza to, e takich funkcji, jak HOUR) lub SlCOND)
mona uywa tylko wtedy, gdy sformatowana warto znacznika zawiera
stosown cz wartoci T1MlSTAMP. Cz OO kolumny T1MlSTAMP nie jest na
przykad wywietlana, jeli rozmiar wywietlania nie przekracza 10. Z tego
powodu prba uycia funkcji HOUR) na wartociach T1MlSTAMP o skrconym
formacie wywietlania zwraca niezrozumiay wynik.
4.3.1.2. Waciwoci TIMESTAMP poczwszy od wersji 4.1 MySQL
Od wersji 4.1.0 waciwoci T1MlSTAMP rni si od tych z wczeniejszych wersji
MySQL.
Kolumny T1MlSTAMP s wywietlane w tym samym formacie, w ktrym
wywietlane s kolumny DATlT1Ml.
Szerokoci wywietlania nie s obsugiwane w sposb opisany w poprzednim
podpunkcie. Innymi sowy, nie mona uywa takich deklaracji, jak
T1MlSTAMP) czy T1MlSTAMP4).
142 Rozdzia 4. Typy kolumn
Dodatkowo, jeli serwer MySQL pracuje w trybie MAXDB, typ T1MlSTAMP jest identycz-
ny z typem DATlT1Ml. Jeli serwer dziaa w trybie MAXDB w momencie tworzenia tabeli,
wszystkie kolumny T1MlSTAMP zostaj utworzone jako kolumny DATlT1Ml. W rezultacie
stosowany jest dla nich format wywietlania DATlT1Ml, ten sam zakres wartoci, a ich
aktualizacja nie jest wykonywana automatycznie.
MySQL mona uruchamia w trybie MAXDB od wersji 4.1.1. Aby tego dokona, naley
uruchomi serwer SQL z opcj s;cceMAXDB lub podczas pracy serwera zmody-
fikowa zmienn globaln s;_cce:
m,sq! SET 0LOBAL sqTmode-MAXDB,
Aby serwer dziaa w trybie MAXDB dla poczenia danego klienta, wystarczy skorzysta
z instrukcji:
m,sq! SET SESSION sqTmode-MAXDB,
4.3.2. Typ TIME
Wartoci T1Ml pobierane s i wywietlane przez MySQL w formacie `OOMMSS` (lub
`OOOMMSS` dla godzin o wikszych wartociach). Wartoci T1Ml nale do zakresu od
`8o8b9b9` do `8o8b9b9`. Element reprezentujcy godzin moe przybiera tak
due wartoci, poniewa typ T1Ml moe suy nie tylko do reprezentowania godzin
w cigu doby (ktra nie moe przekroczy 24 godzin), ale rwnie upywajcego czasu
lub przedziau czasowego midzy dwoma zdarzeniami (a ten moe znacznie przekro-
czy 24 godziny, a nawet by liczb ujemn).
Wartoci T1Ml mona deklarowa w wielu formatach:
Jako acuch w formacie `D OOMMSSu.e`. Mona take uy jednego
z nieco prostszych formatw: `OOMMSSu.e`, `OOMMSS`, `OOMM`, `D
OOMMSS`, `D OOMM`, `D OO` lub `SS`. Parametr & reprezentuje dni i moe
przybiera warto od 0 do 34. Naley zauway, e MySQL nie przechowuje
jeszcze czci uamkowej.
Jako acuch bez znakw rozdzielajcych elementy godziny w formacie
`OOMMSS` przy zaoeniu, e reprezentowana przez niego godzina istnieje.
``0```` naley na przykad odczyta jako ``0````, natomiast ``09/``
jest wartoci niepoprawn (cz reprezentujca liczb minut jest
bezsensowna) i zostanie przeksztacona na `000000`.
Jako liczba w formacie OOMMSS przy zaoeniu, e reprezentowana przez niego
godzina istnieje, na przykad `0``` naley odczyta jako ``0````.
Zrozumiae s take nastpujce formaty alternatywne: SS, MMSS, OOMMSS,
OOMMSSu.e. Naley zauway, e MySQL nie przechowuje jeszcze
czci uamkowej.
Jako wynik funkcji, ktra zwraca warto akceptowan dla typu T1Ml moe
ni by na przykad funkcja CURRlNT_T1Ml.
4.3. Typy zwizane z dat i czasem 143
W przypadku wartoci T1Ml, zadeklarowanych jako acuchy zawierajce elementy
rozdzielajce czci godziny, nie ma potrzeby podawania dwch cyfr dla wartoci go-
dziny, minuty i sekundy, mniejszych ni 10. Warto `8o` jest tym samym, czym
jest `080o0`.
Naley uwaa w przypadku przypisywania do kolumn T1Ml godzin o skrconej postaci.
Podczas interpretacji wartoci bez dwukropkw zakada si, e cyfry na jej prawym
kocu reprezentuj sekundy (MySQL interpretuje wartoci T1Ml jako upywajcy czas,
a nie jako godzin dnia). Mona by sdzi na przykad, e ````` i ``` oznaczaj godzi-
n ````00` (12 minut po 11), ale MySQL zinterpretuje je jako `00``` (11 minut,
12 sekund). Podobnie ``` i ` s interpretowane jako warto `0000``. Wartoci
z dwukropkami s zawsze traktowane jako godzina dnia, czyli ````` bdzie oznacza
````00`, a nie `00````.
Wartoci, ktre s poza zakresem T1Ml, ale oprcz tego s poprawne, zostaj przycite
do najbliszej granicy zakresu. Wartoci `8b00000` i `8b00000` na przykad zosta-
n przeksztacone na `8o8b9b9` i `8o8b9b9`.
Niepoprawne wartoci T1Ml zostaj zapisane jako `000000`. Warto odnotowa, e
poniewa warto `000000` jest sama w sobie poprawn wartoci T1Ml, patrzc na
ni w tabeli, nie mona ustali, czy w ten sposb zostaa zadeklarowana warto ory-
ginalna, czy te jest to warto nieprawidowa.
4.3.3. Typ YEAR
Typ YlAR jest typem jednobajtowym, sucym do przechowywania wartoci lat.
MySQL pobiera i wywietla wartoci YlAR w formacie RRRR. Zakres wynosi od `90`
do `bb.
Wartoci YlAR mona deklarowa za pomoc rnych formatw:
W postaci czterocyfrowego acucha w przedziale od ``90`` do ``bb`.
W postaci czterocyfrowej liczby w przedziale od `90` do `bb.
W postaci dwucyfrowego acucha w przedziale od `00` do `99`. Wartoci
z zakresu od `00` do `69` i od `/0` do `99` s przeksztacane na wartoci
YlAR nalece do zakresw od 00` do 069 i od `9/0 do `999. Naley jednak
pamita, e zakres dla liczb dwucyfrowych rni si troch od zakresu
dla dwucyfrowych acuchw, poniewa nie mona zadeklarowa zera
jako liczby, by zostao zinterpretowane jako 000. Wstawienie wartoci 00
do czterocyfrowej kolumny YlAR spowoduje przechowanie jej pod postaci
0000, a nie na 000. Aby warto zostaa rozpoznana jako rok 000, naley
przesa j w postaci acucha `0` lub `00`.
W postaci wyniku funkcji, ktra zwraca warto dopuszczaln dla typu YlAR,
na przykad funkcja NOw).
Niepoprawne wartoci YlAR zostaj przechowane pod postaci 0000.
144 Rozdzia 4. Typy kolumn
4.3.4. Problem roku 2000 a typy zwizane z dat
Sam MySQL jest cakowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednak
wartoci wejciowe, dostarczane serwerowi MySQL, takie by nie musz. Wszystkie
daty z rokiem, wprowadzane w postaci dwucyfrowej, s niejednoznaczne, poniewa nie
wiadomo, o ktre stulecie chodzi. Takie wartoci musz by przeksztacone na form
czterocyfrow, poniewa wewntrznie lata przechowywane s przez MySQL w penej,
czterocyfrowej postaci.
Dla typw DATlT1Ml, T1MlSTAMP i YlAR daty interpretowane s niejednoznacznie, na
podstawie nastpujcych zasad:
Wartoci z zakresu 0069 przeksztacane s na wartoci 000069.
Wartoci z zakresu /099 przeksztacane s na wartoci `9/0`999.
Naley pamita, e te reguy pozwalaj jedynie domyli si, co oznaczaj wprowa-
dzone przez uytkownika wartoci. W przypadku uzyskania wartoci, ktra nie jest
poprawna, naley poda rok w penej, czterocyfrowej postaci.
Za pomoc instrukcji ORDlR BY mona poprawnie sortowa wartoci T1MlSTAMP i YlAR,
w ktrych rok jest podany w postaci dwucyfrowej.
Niektre funkcje, takie jak M1N) i MAX) przeksztacaj wartoci T1MlSTAMP lub YlAR na
liczby. To oznacza, e w przypadku wartoci z rokiem, podanym w postaci dwucyfrowej,
funkcje te dadz bdny wynik. Aby tego unikn, naley przeksztaci wartoci YlAR
lub T1MlSTAMP na format, w ktrym rok jest w postaci czterocyfrowej, lub skorzysta
w nastpujcy sposb z funkcji DATl_ADD: M1NDATl_ADD'es'.,, 1NTlRVA| 0 DAYS)).
4.4. Typy acuchowe
Do typw acuchowych zalicza si CHAR, VARCHAR, B|OB, TlXT, lNUM i SlT. W tym pod-
rozdziale przedstawione zostanie ich przeznaczenie, a take omwione bd metody
wykorzystywania tych typw w zapytaniach.
4.4.1. Typy CHAR i VARCHAR
Typy CHAR i VARCHAR s do siebie podobne. Rni si tylko sposobem, w jaki s prze-
chowywane i pobierane.
Dugo kolumny CHAR jest staa i deklaruje si j podczas tworzenia tabeli. Maksymalna
dugo kolumny moe by wartoci z przedziau od 0 do 255 (w wersjach poprzedza-
jcych MySQL 3.23 dugo CHAR moga wynosi od 1 do 255). Wartoci CHAR podczas
zapisywania uzupeniane s z prawej strony odpowiedni liczb spacji. Spacje te s
jednak odcinane w momencie pobierania ich przez klienta.
4.4. Typy acuchowe 145
Wartoci w kolumnach VARCHAR s acuchami o zmiennej dugoci. Mona zadekla-
rowa kolumn VARCHAR o dowolnej dugoci z przedziau od 0 do 255, podobnie jak
w przypadku kolumn CHAR (w wersjach poprzedzajcych MySQL 4.0.2 dugo VARCHAR
moga wynosi od 1 do 255 znakw). W przeciwiestwie jednak do typu CHAR, warto-
ci VARCHAR s przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania a-
cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania dugoci. Wartoci nie
s dopeniane spacjami, natomiast znajdujce si na kocu spacje s usuwane, gdy
warto jest zapisywana w tabeli. To odrnia MySQL od specyfikacji typu VARCHAR
w standardzie SQL.
Podczas zapisywania lub pobierania tych typw nie jest wykonywana take adna
konwersja zwizana z wielkoci liter.
Jeli do kolumny CHAR lub VARCHAR przypisze si warto przekraczajc maksymaln
dugo kolumny, warto ta zostanie obcita w celu jej dopasowania.
Jeli uytkownik potrzebuje kolumny, dla ktrej nie s usuwane kocowe spacje, powi-
nien zastanowi si nad zastosowaniem typu B|OB lub TlXT. Aby przechowa wartoci
binarne (takie jak wynik funkcji szyfrujcej lub kompresujcej), ktre mog zawiera
przypadkowe wartoci bajtw, zamiast CHAR lub VARCHAR naley uy raczej kolumny
B|OB. To pozwoli unikn potencjalnych problemw z usuwaniem kocowych spacji,
ktre mogyby zmieni warto danych.
W poniszym zestawieniu przedstawiono rnice midzy tymi dwoma typami kolumn
i pokazano rezultat zapisania rnych wartoci acuchowych w kolumnach CHAR4)
i VARCHAR4):
Warto CHAR(4) Wymagana pami VARCHAR(4) Wymagana pami
'' ' ' 4 oa!, '' 1 oa!
'ao' 'ao ' 4 oa!, 'ao' : oa!,
'aocc' 'aocc' 4 oa!, 'aocc' 5 oa!.
'aoccef_h' 'aocc' 4 oa!, 'aocc' 5 oa!.
Wartoci pobrane z kolumn CHAR4) i VARCHAR4) bd w obu przypadkach takie same,
poniewa z kolumn CHAR w momencie pobierania wartoci z tabeli usuwane s koco-
we spacje.
Poczwszy od MySQL 4.1 wartoci w kolumnach CHAR i VARCHAR s sortowane i po-
rwnywane wedug porzdku sortowania zestawu znakw przypisanego do kolumny.
W wersjach wczeniejszych sortowanie i porwnania byy wykonywane na podstawie
porzdku sortowania zestawu znakw serwera. Uytkownik moe deklarowa kolumn
z atrybutem B1NARY, aby podczas sortowania i porwnywania brana bya pod uwag wiel-
ko liter, poniewa uyte zostan wartoci liczbowe kodu, a nie porzdek leksykalny.
Atrybut B1NARY nie wpywa na sposb, w jaki kolumna jest przechowywana i pobierana.
Od MySQL 4.1.0 typ CHAR BYTl jest aliasem typu CHAR B1NARY. Jest to spowodowane
wymogami kompatybilnoci.
146 Rozdzia 4. Typy kolumn
Atrybut B1NARY jest trway. Oznacza to, e jeli kolumna z atrybutem B1NARY zostanie
uyta w wyraeniu, cae wyraenie bdzie traktowane jako warto B1NARY.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut ASC11. Przypisuje on zestaw znaku
.'n`.
Od wersji 4.1.0 mona okrela dla typu CHAR atrybut UN1CODl. Przypisuje on zestaw
znaku ucs.
Podczas tworzenia tabeli typ kolumny CHAR lub VARCHAR moe zosta zmieniony bez
informowania o tym uytkownika (patrz podpunkt 6.2.5.2).
4.4.2. Typy BLOB i TEXT
B|OB jest skrtem angielskiej nazwy binary large object (wielki obiekt binarny). Cztery
typy B|OB: T1NYB|OB, B|OB, MlD1UMB|OB i |ONOB|OB rni si tylko maksymaln dugo-
ci wartoci, ktre mog przechowywa (patrz podrozdzia 4.5).
Cztery typy TlXT: T1NYTlXT, TlXT, MlD1UMTlXT i |ONOTlXT odpowiadaj czterem typom
B|OB i maj te same maksymalne dugoci i wymagania co do pamici.
Kolumny typu B|OB s traktowane jako acuchy binarne. Kolumny TlXT s traktowane
zgodnie z ich zestawem znakw. Podczas sortowania i porwnywania wartoci B|OB
nie jest brana pod uwag wielko liter. Od wersji 4.1 MySQL operacje sortowania
i porwnywania wartoci w kolumnach typu TlXT s wykonywane wedug porzdku
sortowania zestawu znakw przypisanego do kolumny. Wczeniej sortowanie i porw-
nywanie tych kolumn byo wykonywane na podstawie porzdku sortowania zestawu
znakw serwera.
Podczas zapisu i pobierania nie jest wykonywana adna konwersja zwizana z wielkoci
liter.
Jeli do kolumny B|OB lub TlXT zostanie przypisana warto, ktra przekroczy maksymal-
n dugo tego typu kolumny, warto zostanie przycita.
W pewnym sensie kolumn TlXT mona traktowa jako kolumn VARCHAR o dowolnej
wielkoci. Podobnie kolumn B|OB mona traktowa jako kolumn VARCHAR B1NARY.
Typy B|OB i TlXT rni si od typw CHAR i VARCHAR nastpujcymi cechami:
Kolumny B|OB i TlXT mog mie indeksy dopiero od wersji 3.23.2 MySQL.
Starsze wersje programu nie obsugiway indeksowania tych typw kolumn.
Dla indeksw na kolumnach B|OB i TlXT naley okreli dugo przedrostka
indeksu. Dla typw CHAR i VARCHAR jest to opcjonalne.
Dla kolumn B|OB i TlXT nie ma usuwania kocowych spacji podczas
zapisywania lub pobierania wartoci. To odrnia je od kolumn CHAR
(spacje kocowe s usuwane w momencie pobierania wartoci) i od kolumn
VARCHAR (spacje kocowe s usuwane w momencie zapisywania wartoci).
Kolumny typu B|OB i TlXT nie mog mie wartoci Dl|AU|T.
4.4. Typy acuchowe 147
Od MySQL 4.1.0 typ |ONO i |ONO VARCHAR odpowiada typowi danych MlD1UMTlXT. Jest
to mechanizm dodany dla kompatybilnoci.
Interfejs Connector/ODBC deklaruje wartoci B|OB jako |ONOVARB1NARY, a wartoci TlXT
jako |ONOVARCHAR.
Poniewa wartoci B|OB i TlXT mog by niezwykle dugie, podczas ich stosowania
mona spotka si z pewnymi ograniczeniami:
Jeli na kolumnie typu B|OB lub TlXT ma by wykonana operacja OROUP BY
lub ORDlR BY, warto kolumny naley przeksztaci na obiekt o staej dugoci.
Standardowo wykonuje si to za pomoc funkcji SUBSTR1NO, na przykad:
m,sq! SELEOT comment FROM PC\YCAVCDGNK,SUBSTRIN0(comment,20) AS substr
- ORDER BY substr,
W przeciwnym razie podczas sortowania uyte zostan tylko pierwsze bajty
.x_scr'_en'| kolumny. Domylna warto zmiennej .x_scr'_en'|
wynosi 1024 i mona j zmieni przy uyciu opcji .x_scr'_en'|
podczas uruchamiania serwera ,s;c.
Istnieje moliwo wykonania operacji grupowania na wyraeniu, ktre jest
zwizane z wartociami B|OB lub TlXT za pomoc aliasu lub przez okrelenie
pooenia kolumny:
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00) AS b
- FROM PC\YCAVCDGNK 0ROUP BY b,
m,sq! SELEOT 1d,SUBSTRIN0(MQNWOPCADNQD,i,i00)
- FROM PC\YCAVCDGNK 0ROUP BY 2,
Maksymalny rozmiar obiektu B|OB lub TlXT okrela jego typ, ale o tym,
jak najwiksz warto mona w rzeczywistoci przesa midzy
klientem a serwerem, decyduje ilo dostpnej pamici i rozmiar buforw
komunikacyjnych. Rozmiar bufora wiadomoci mona zastpi, zmieniajc
warto zmiennej .x_.c.ec_,.ce', ale trzeba to zrobi dla serwera
i programu klienckiego. Na przykad na zmian wartoci opcji .x_.c.ec_
,.ce' po stronie klienta pozwalaj ,s; i ,s;cu,.
Kada warto B|OB i TlXT jest wewntrznie reprezentowana przez obiekty o oddzielnie
przydzielanej pamici. To odrnia je od wszystkich innych typw kolumn, dla ktrych
pami jest przydzielana raz na ca kolumn w momencie otwarcia tabeli.
4.4.3. Typ Enum
lNUM to obiekt acuchowy z wartoci wybieran z listy dozwolonych wartoci, ktre
s w sposb jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.
W pewnych warunkach warto moe by rwnie pustym acuchem (``) lub wartoci
NU||:
Jeli do kolumny lNUM zostanie wstawiona niepoprawna warto (czyli acuch
nienalecy do listy dopuszczalnych wartoci), to zostanie zastpiona pustym
148 Rozdzia 4. Typy kolumn
acuchem reprezentujcym bdn warto. Mona go odrni od zwykego
pustego acucha, poniewa jego warto liczbowa jest rwna 0. Wicej o tym
za chwil.
Jeli w deklaracji kolumny lNUM dopuszczone bdzie uycie wartoci NU||,
bdzie ona wartoci prawidow i wtedy wartoci domyln jest NU||.
Jeli kolumna lNUM zostanie zadeklarowana jako NOT NU||, jej wartoci
domyln bdzie pierwszy element na licie dozwolonych wartoci.
Kada warto wyliczenia ma indeks:
Wartoci nalece do listy dopuszczalnych elementw w deklaracji kolumny
s ponumerowane, rozpoczynajc od 1.
Warto indeksu pustego acucha reprezentujcego bd wynosi 0. Oznacza to,
e ponisza instrukcja Sl|lCT pomoe odszuka wiersze, ktrym przypisano
niepoprawne wartoci lNUM:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAGPWO-0,
Indeksem wartoci NU|| jest NU||.
Kolumna zadeklarowana jako lNUM `_ecen`, `c..`, `'r.,`) moe na przykad zawie-
ra dowoln z przedstawionych w zestawieniu wartoci. Dodatkowo zaprezentowana
zostaa warto indeksu kadej wartoci:
Warto Indeks
NU|| NU||
'' 0
'ecen' 1
'c.a'
'!rz,' :
Wyliczenie moe zawiera maksymalnie 65 535 elementw.
Poczwszy od wersji 3.23.51 MySQL wartoci nalece do lNUM maj automatycznie
usuwane spacje kocowe w momencie tworzenia tabeli.
Podczas przypisywania wartoci do kolumny lNUM nieistotna jest wielko liter. Wartoci
pobrane pniej z takiej kolumny s jednak wywietlane przy uyciu liter o wielkoci
uytej w definicji kolumny.
Jeli warto lNUM zostanie pobrana w postaci liczbowej, zwrcony zostanie indeks
wartoci kolumny. W nastpujcy sposb mona na przykad pobra warto liczbow
z kolumny lNUM:
m,sq! SELEOT MQNAGPWO+0 FROM PC\YCAVCDGNK,
Jeli do kolumny lNUM zostanie wpisana liczba, bdzie ona traktowana jako warto
indeksu, a przechowywana warto bdzie elementem wyliczenia o tym indeksie (nie
zadziaa to jednak z instrukcj |OAD DATA, poniewa traktuje ona wszystkie dane wej-
4.4. Typy acuchowe 149
ciowe jako acuchy). Nie zaleca si deklarowania kolumn lNUM z wartociami wyli-
czenia, ktre wygldem przypominaj liczby, poniewa moe to atwo doprowadzi do
pomyki. Ponisza kolumna zawiera na przykad elementy wyliczenia, ktrych warto-
ci acucha `0`, ``` i `` maj wartoci liczbowe indeksu rwne `, i o:
!:czo, FNUM'0' '1' ''|
Sortowanie wartoci lNUM odbywa si na podstawie porzdku, w ktrym elementy
wyliczenia zostay wymienione w deklaracji kolumny (innymi sowy wartoci lNUM s
sortowane wedug przypisanych im wartoci indeksu), na przykad `.` zostanie usta-
wione przed `|` dla lNUM`.`, `|`), ale `|` stanie przed `.` dla lNUM `|`, `.`).
Pusty acuch zostaje ustawiony przed acuchem niepustym, wartoci NU|| zostan
umiejscowione przed wszystkimi innymi wartociami wyliczenia. Aby zapobiec nie-
oczekiwanym wynikom, naley w deklaracji kolumny wymieni wartoci wyliczenia
listy lNUM w porzdku alfabetycznym. Mona rwnie zastosowa OROUP BY CASTMQN
AS VARCHAR) lub OROUP BY CONCATMQN), aby upewni si, e kolumna zostanie uporzd-
kowana alfabetycznie, a nie wedug liczb w indeksie.
Aby ustali wszystkie moliwe wartoci dla kolumny lNUM, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAGPWO i przetworzy definicj lNUM w drugiej
kolumnie danych wyjciowych.
4.4.4. Typ SET
SlT to obiekt acuchowy skadajcy si z zera lub wikszej liczby wartoci, z ktrych
kada musi by wybrana z listy dozwolonych wartoci, wyliczonych w deklaracji kolum-
ny podczas tworzenia tabeli. W przypadku wartoci kolumny typu SlT, skadajcych si
z wielu elementw zestawu, elementy te s oddzielane przecinkami (,). Z tego powodu
wartoci elementw SlT nie mog zawiera przecinkw.
Kolumna zadeklarowana na przykad jako SlT`_ecen`, `c..`) NOT NU|| moe mie
jedn z nastpujcych wartoci:
''
'ecen'
'c.a'
'ecen c.a'
Typ SET moe zawiera maksymalnie 64 rne elementy.
Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementw nalecych do zestawu
wartoci automatycznie usuwane s spacje kocowe.
W MySQL wartoci SlT przechowywane s w postaci liczbowej, w ktrej bit mniej zna-
czcy przechowywanej wartoci odpowiada pierwszemu elementowi zestawu. Warto
SlT pobrana w postaci liczbowej ma ustawione bity odpowiadajce elementom zestawu,
ktre tworz warto kolumny. Mona na przykad pobra wartoci liczbowe z kolum-
ny SlT w nastpujcy sposb:
m,sq! SELEOT MQNAUGV+0 FROM PC\YCAVCDGNK,
150 Rozdzia 4. Typy kolumn
Jeli liczba jest zapisana w kolumnie SlT, bity wczone w binarnej reprezentacji liczby
okrelaj elementy zestawu w wartoci kolumny. Dla kolumny zadeklarowanej jako
SlT`.`, `|`, `c`, `c`) elementy maj nastpujce wartoci dziesitne i binarne:
Element SET Warto dziesitna Warto binarna
'a' 1 0001
'o' 0010
'c' 4 0100
'c' 8 1000
Jeli do takiej kolumny przypisze si warto 9, odpowiada to binarnej wartoci 1001,
czyli wybrane s pierwszy i czwarty element wartoci SlT `.` i `c`, dlatego w wyniku
otrzymamy warto `.,c`.
W przypadku wartoci zawierajcej wicej ni jeden element SlT, nie ma znaczenia
kolejno, w jakiej elementy s wymienione podczas wstawiania wartoci. Nie ma rw-
nie znaczenia, ile razy dany element jest wymieniony w wartoci. Kiedy pniej war-
to jest pobierana, kady element w wartoci bdzie pojawia si raz z elementami
wymienionymi zgodnie z porzdkiem, w ktrym zostay podane podczas tworzenia
tabeli. Jeli kolumna zostaa zadeklarowana jako SlT`.,`|`,`c`,`c`), wtedy warto-
ci `.,c`, `c,.` i `c,.,.,c,c` pojawi si w momencie pobrania jako `.,c`.
Jeli do kolumny SlT zostanie przypisana warto nieobsugiwana., zostanie ona zigno-
rowana.
Wartoci SlT s sortowane wedug porzdku liczbowego. Wartoci NU|| s ustawiane
przed niezerowymi wartociami SlT.
Zazwyczaj element zestawu wyszukuje si za pomoc funkcji |1ND_1N_SlT) lub operato-
ra |1|l:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE FINDINSET(YCTVQ,MQNAUGV)0,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV LIKE 'YCTVQ',
Pierwsza instrukcja znajduje wiersze, w ktrych kolumna MQNAUGV zawiera element ze-
stawu YCTVQ. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w ktrych
kolumna MQNAUGV zawiera warto w dowolnym miejscu, nawet jako podacuch innego
elementu zestawu.
Ponisze instrukcje s rwnie prawidowe:
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV & i,
m,sq! SELEOT ^ FROM PC\YCAVCDGNK WHERE MQNAUGV - YCT,YCT,
Pierwsza z tych instrukcji powoduje wyszukanie wartoci zawierajcych pierwszy
element zestawu, druga wyszukanie elementu, ktry dokadnie pasuje do wzorca.
Z porwnaniami drugiego typu naley uwaa. Porwnywanie wartoci zestawu do
`YCT,YCT` zwrci inny wynik ni porwnanie wartoci do `YCT,YCT`. Wartoci
naley podawa dokadnie w tej samej kolejnoci, w ktrej s zadeklarowane w defi-
nicji kolumny.
4.5. Rozmiar pamici potrzebnej dla typw kolumn 151
Aby ustali wszystkie moliwe wartoci dla kolumny SlT, naley uy instrukcji SHOw
CO|UMNS |ROM PC\YCAVCDGNK |1|l MQNAUGV i przetworzy definicj SlT w drugiej kolumnie
wyniku.
4.5. Rozmiar pamici
potrzebnej dla typw kolumn
Rozmiar pamici dla kadego z typw kolumn, obsugiwanych przez MySQL, zosta
wymieniony wedug kategorii.
Maksymalny rozmiar wiersza w tabeli M,1SAM wynosi 65 534 bajty. Kada kolumna
typu B|OB lub TlXT stanowi tylko 5 do 9 bajtw tego rozmiaru.
Jeli tabela M,1SAM lub 1SAM zawiera jakie typy kolumn o zmiennej dugoci, take
i format rekordu bdzie zmiennej dugoci. Podczas tworzenia tabeli, MySQL moe
spowodowa w pewnych okolicznociach zmian typu kolumny zmiennej dugoci na
kolumn staej dugoci lub na odwrt (patrz podpunkt 6.2.5.2).
Rozmiar pamici potrzebnej dla typw liczbowych
Typ kolumny Wymagany rozmiar pamici
TTNYTNT 1 bajt
SM/||TNT 2 bajty
MFOTUMTNT 3 bajty
TNT, TNTFFR 4 bajty
BTTNT 8 bajtw
F|J/TR| 4 bajty jeli 0 R 4, 8 bajtw jeli 5 R 5:
F|J/T 4 bajty
OJUB|F PRFCTSTJN, RF/| 8 bajtw
OFCTM/|/&|, NUMFRTC/&| / bajty jeli & 0, /1 bajt jeli & 0 (& jeli /&)
Rozmiar pamici potrzebnej dla typw zwizanych z dat i czasem
Typ kolumny Wymagany rozmiar pamici
O/TF 3 bajty
O/TFTTMF 8 bajtw
TTMFST/MP 4 bajty
TTMF 3 bajty
YF/R 1 bajt
152 Rozdzia 4. Typy kolumn
Rozmiar pamici potrzebnej dla typw acuchowych
Typ kolumny Wymagany rozmiar pamici
C'/R/| / bajtw, 0 / 55
V/RC'/R/| .1 bajtw, gdzie . / i 0 / 55
TTNYB|JB, TTNYTFXT .1 bajtw, gdzie .

B|JB, TFXT . bajty, gdzie .

MFOTUMB|JB, MFOTUMTFXT .: bajty, gdzie .

|JNB|JB, |JNTFXT .4 bajty, gdzie .

FNUMYCTVQ
YCTVQ|
1 lub 2 bajty w zalenoci od liczby wartoci wyliczenia
(maksymalnie 65 535)
SFTYCTVQ
YCTVQ|
1, 2, 3, 4 lub 8 bajtw w zalenoci od liczby elementw zestawu
(maksymalnie 64)
Typy VARCHAR, B|OB i TlXT maj zmienn dugo. Dla kadego ilo pamici potrzeb-
nej do przechowania wartoci bdzie zalee od faktycznej dugoci wartoci kolumny
(reprezentowanej w ostatniej tabeli przez .), a nie od maksymalnego moliwego roz-
miaru danego typu. Kolumna VARCHAR`0) na przykad moe przechowywa acuch
o maksymalnej dugoci 10 znakw. Faktyczna ilo wymaganej pamici to dugo
acucha (.) plus 1 bajt do zapisania dugoci acucha. Dla acucha `.|cc` parametr
. jest rwny 4, a wymagany rozmiar pamici to 5 bajtw.
Typy B|OB i TlXT wymagaj 1, 2, 3 lub 4 bajtw do zapisu dugoci wartoci kolumny
w zalenoci od maksymalnej moliwej dugoci tego typu (patrz punkt 4.4.2).
Rozmiar obiektu lNUM jest ustalany na podstawie liczby rnych wartoci wyliczenia.
Przy wyliczeniach do 255 moliwych wartoci uywany jest jeden bajt, a przy wyli-
czeniach do 65 535 wartoci uywane s 2 bajty (patrz punkt 4.4.3).
Rozmiar obiektu SlT jest okrelany przez liczb rnych elementw zestawu. Jeli ze-
staw ma rozmiar 0, obiekt zajmuje 0/).8 bajtw, ktr to warto zaokrgla si do
1, 2, 3, 4 lub 8 bajtw. Obiekt SlT moe mie do 64 elementw (patrz punkt 4.4.4).
4.6. Wybieranie odpowiedniego typu
dla kolumny
Aby jak najbardziej wydajnie korzysta z pamici, naley we wszystkich przypadkach
stara si stosowa typ, ktry bdzie jak najbardziej dokadny. Jeli na przykad w kolum-
nie liczb cakowitych bd przechowywane wartoci z zakresu od ` do 99999, najlep-
szym wyborem bdzie typ MlD1UM1NT UNS1ONlD. Ze wszystkich typw, ktre reprezentuj
wszystkie wymagane wartoci, zajmuje najmniej pamici.
4.7. Wykorzystywanie typw kolumn z innych mechanizmw baz danych 153
Powszechnym problemem jest dokadne przedstawianie wartoci walutowych. W MySQL
naley do tego uywa typu DlC1MA|, za pomoc ktrego wartoci zapisywane s w for-
mie acucha. Dziki temu nie traci si na dokadnoci (mimo to obliczenia z wartociami
DlC1MA| mog by wci wykonywane przy uyciu operacji dziaajcych na liczbach
z podwjn precyzj). Jeli dokadno nie jest zbyt wana, by moe wystarczajco
dobrym typem bdzie DOUB|l.
Aby uzyska wiksz dokadno, mona zawsze przeksztaci warto na typ stao-
przecinkowy, przechowywany w B1O1NT. Pozwoli to wykonywa wszystkie obliczenia
na liczbach cakowitych i tylko w razie potrzeby przeksztaca wynik z powrotem na
wartoci zmiennoprzecinkowe.
4.7. Wykorzystywanie typw kolumn
z innych mechanizmw baz danych
Aby uatwi uytkownikowi zastosowanie kodu pochodzcego od innych producentw,
moliwe jest odwzorowanie typw kolumn w sposb przedstawiony w poniszej tabeli.
Odwzorowania te upraszczaj operacj importu do MySQL definicji tabel z innych
mechanizmw baz danych:
Typ innych producentw Typ MySQL
BTN/RY/| C'/R/| BTN/RY
C'/R V/RYTN/| V/RC'/R/|
F|J/T4 F|J/T
F|J/T8 OJUB|F
TNT1 TTNYTNT
TNT SM/||TNT
TNT: MFOTUMTNT
TNT4 TNT
TNT8 BTTNT
|JN V/RBTN/RY MFOTUMB|JB
|JN V/RC'/R MFOTUMTFXT
|JN MFOTUMTFXT oc M,SJ| 410|
MTOO|FTNT MFOTUMTNT
V/RBTN/RY/| C'/R/| BTN/RY
Odwzorowanie typw kolumn jest wykonywane podczas tworzenia tabeli, po czym
oryginalne deklaracje typu zostaj usunite. Jeli uytkownik utworzy tabel z typami
stosowanymi przez innych producentw, po czym wyda polecenie DlSCR1Bl PC\YCA
VCDGNK, zostanie przedstawiona struktura tabeli z odpowiadajcymi im typami MySQL.
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
PRZYKADOWY ROZDZIA PRZYKADOWY ROZDZIA
IDZ DO IDZ DO
ZAMW DRUKOWANY KATALOG ZAMW DRUKOWANY KATALOG
KATALOG KSIEK KATALOG KSIEK
TWJ KOSZYK TWJ KOSZYK
CENNIK I INFORMACJE CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK ZAMW CENNIK
CZYTELNIA CZYTELNIA
FRAGMENTY KSIEK ONLINE FRAGMENTY KSIEK ONLINE
SPIS TRECI SPIS TRECI
DODAJ DO KOSZYKA DODAJ DO KOSZYKA
KATALOG ONLINE KATALOG ONLINE
MySQL. Opis jzyka
Autor: Paul Dubois
Tumaczenie: Pawe Gonera, Anna Zawadzka
ISBN: 83-7361-688-8
Tytu oryginau: MySQL Language Reference
Format: B5, stron: 472
MySQL to najpopularniejsza na wiecie baza danych dostpna na licencji open
source. Dziki swojej wydajnoci, szybkoci dziaania, stabilnoci i rozbudowanym
mechanizmom zabezpiecze jest wykorzystywana niemal do wszystkich zada, do
jakich moe by potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji
korporacyjnych, witryn WWW i sklepw internetowych. Bogactwo funkcji i moliwoci
to ogromna zaleta rodowiska MySQL, jednake zapamitanie skadni, parametrw
i sposobw stosowania wszystkich polece i rozszerze jest praktycznie niemoliwe.
Kady, kto chce biegle posugiwa si t baz, powinien mie pod rk materiay
opisujce stosowany w niej jzyk SQL.
Ksika MySQL. Opis jzyka to najlepsze rdo takich informacji. Stworzona,
zredagowana i sprawdzona przez pracownikw dziaw pomocy i produkcji firmy
MySQL AB publikacja zawiera wszystko, co moe by potrzebne uytkownikowi bazy
danych MySQL. Przedstawia zarwno zagadnienia podstawowe, takie jak: struktura
jzyka, typy danych i zasady konstruowania zapyta, jak i tematy zaawansowane:
transakcje, replikacj oraz administrowanie baz. Szczegowo opisane s rwnie
wszystkie zagadnienia zwizane z zaimplementowanym w niej jzykiem SQL.
Podstawowe informacje o MySQL
Jzyk SQL instrukcje, typy danych, funkcje i operatory
Zapytania
Definiowanie danych
Obsuga transakcji
Zarzdzanie kontami uytkownikw
Konserwacja tabel
Replikacja baz danych
Rozszerzenia MySQL dla systemw GIS
Procedury skadowane
Obsuga bdw
Spis treci
Rozdzia 1. Informacje oglne.............................................................................. 9
1.1. Na temat tego podrcznika....................................................................................... 9
1.1.1. Zasady przyjte w tym podrczniku .......................................................... 10
1.2. Omwienie systemu zarzdzania baz danych MySQL......................................... 12
1.2.1. Historia MySQL........................................................................................ 13
1.2.2. Gwne cechy MySQL.............................................................................. 14
1.2.3. Stabilno MySQL .................................................................................... 17
1.2.4. Jak due mog by tabele MySQL ............................................................ 18
1.2.5. Zgodno z rokiem 2000 ........................................................................... 19
1.3. Omwienie MySQL AB ........................................................................................ 21
1.3.1. Model biznesowy i usugi MySQL AB...................................................... 22
1.3.2. Informacje o kontakcie .............................................................................. 25
1.4. Obsuga techniczna oraz wydawanie licencji MySQL........................................... 26
1.4.1. Obsuga techniczna oferowana przez MySQL AB........................................ 26
1.4.2. Prawa autorskie i licencje .......................................................................... 27
1.4.3. Licencje MySQL ....................................................................................... 28
1.4.4. Logo i znaki towarowe MySQL ................................................................ 30
1.5. Plany rozwoju MySQL .......................................................................................... 32
1.5.1. MySQL 4.0 w skrcie................................................................................ 33
1.5.2. MySQL 4.1 w skrcie................................................................................ 35
1.5.3. MySQL 5.0: nastpna wersja rozwojowa .................................................. 37
1.6. MySQL i przyszo (TODO) ................................................................................ 37
1.6.1. Nowe mechanizmy planowane dla wersji 4.1............................................ 38
1.6.2. Nowe funkcje planowane dla wersji 5.0.................................................... 38
1.6.3. Nowe funkcje planowane dla 5.1............................................................... 39
1.6.4. Nowe funkcje planowane w bliskiej przyszoci ......................................... 40
1.6.5. Nowe funkcje planowane w niezbyt odlegej przyszoci.......................... 43
1.6.6. Nowe funkcje, ktrych wdroenia nie planujemy.......................................... 44
1.7. rda informacji o MySQL .................................................................................. 45
1.7.1. Listy dyskusyjne powicone MySQL ...................................................... 45
1.7.2. Wspomaganie rodowiska MySQL na IRC (Internet Relay Chat)............. 54
1.8. Zgodno MySQL ze standardami ......................................................................... 55
1.8.1. Standardy speniane przez MySQL............................................................ 56
1.8.2. Wybieranie trybw MySQL ...................................................................... 56
1.8.3. Uruchamianie MySQL w trybie ANSI ...................................................... 56
1.8.4. Rozszerzenia MySQL do standardu SQL.................................................. 57

You might also like