MySQL. Opis języka

36
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE MySQL. Opis jêzyka Autor: Paul Dubois T³umaczenie: Pawe³ Gonera, Anna Zawadzka ISBN: 83-7361-688-8 Tytu³ orygina³u: MySQL Language Reference Format: B5, stron: 472 MySQL to najpopularniejsza na wiecie baza danych dostêpna na licencji open source. Dziêki swojej wydajnoci, szybkoci dzia³ania, stabilnoci i rozbudowanym mechanizmom zabezpieczeñ jest wykorzystywana niemal do wszystkich zadañ, do jakich mo¿e byæ potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji korporacyjnych, witryn WWW i sklepów internetowych. Bogactwo funkcji i mo¿liwoci to ogromna zaleta rodowiska MySQL, jednak¿e zapamiêtanie sk³adni, parametrów i sposobów stosowania wszystkich poleceñ i rozszerzeñ jest praktycznie niemo¿liwe. Ka¿dy, kto chce biegle pos³ugiwaæ siê t¹ baz¹, powinien mieæ pod rêk¹ materia³y opisuj¹ce stosowany w niej jêzyk SQL. Ksi¹¿ka „MySQL. Opis jêzyka” to najlepsze ród³o takich informacji. Stworzona, zredagowana i sprawdzona przez pracowników dzia³ów pomocy i produkcji firmy MySQL AB publikacja zawiera wszystko, co mo¿e byæ potrzebne u¿ytkownikowi bazy danych MySQL. Przedstawia zarówno zagadnienia podstawowe, takie jak: struktura jêzyka, typy danych i zasady konstruowania zapytañ, jak i tematy zaawansowane: transakcje, replikacjê oraz administrowanie baz¹. Szczegó³owo opisane s¹ równie¿ wszystkie zagadnienia zwi¹zane z zaimplementowanym w niej jêzykiem SQL. • Podstawowe informacje o MySQL • Jêzyk SQL — instrukcje, typy danych, funkcje i operatory • Zapytania • Definiowanie danych • Obs³uga transakcji • Zarz¹dzanie kontami u¿ytkowników • Konserwacja tabel • Replikacja baz danych • Rozszerzenia MySQL dla systemów GIS • Procedury sk³adowane • Obs³uga b³êdów

description

to najpopularniejsza na świecie baza danych dostępna na licencji open source. Dzięki swojej wydajności, szybkości działania, stabilności i rozbudowanym mechanizmom zabezpieczeń jest wykorzystywana niemal do wszystkich zadań, do jakich może być potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji korporacyjnych, witryn WWW i sklepów internetowych. Bogactwo funkcji i możliwości to ogromna zaleta środowiska MySQL, jednakże zapamiętanie składni, parametrów i sposobów stosowania wszystkich poleceń i rozszerzeń jest praktycznie niemożliwe. Każdy, kto chce biegle posługiwać się tą bazą, powinien mieć pod ręką materiały opisujące stosowany w niej język SQL.Książka "MySQL. Opis języka" to najlepsze źródło takich informacji. Stworzona, zredagowana i sprawdzona przez pracowników działów pomocy i produkcji firmy MySQL AB publikacja zawiera wszystko, co może być potrzebne użytkownikowi bazy danych MySQL. Przedstawia zarówno zagadnienia podstawowe, takie jak: struktura języka, typy danych i zasady konstruowania zapytań, jak i tematy zaawansowane: transakcje, replikację oraz administrowanie bazą. Szczegółowo opisane są również wszystkie zagadnienia związane z zaimplementowanym w niej językiem SQL.* Podstawowe informacje o MySQL* Język SQL -- instrukcje, typy danych, funkcje i operatory* Zapytania* Definiowanie danych* Obsługa transakcji* Zarządzanie kontami użytkowników* Konserwacja tabel* Replikacja baz danych* Rozszerzenia MySQL dla systemów GIS* Procedury składowane* Obsługa błędówJeśli szukasz pewnego źródła wiedzy o MySQL, nie mogłeś lepiej trafić.

Transcript of MySQL. Opis języka

Page 1: MySQL. Opis języka

Wydawnictwo Helion

ul. Chopina 6

44-100 Gliwice

tel. (32)230-98-63

e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

MySQL. Opis jêzyka

Autor: Paul Dubois

T³umaczenie: Pawe³ Gonera, Anna Zawadzka

ISBN: 83-7361-688-8

Tytu³ orygina³u: MySQL Language Reference

Format: B5, stron: 472

MySQL to najpopularniejsza na �wiecie baza danych dostêpna na licencji open

source. Dziêki swojej wydajno�ci, szybko�ci dzia³ania, stabilno�ci i rozbudowanym

mechanizmom zabezpieczeñ jest wykorzystywana niemal do wszystkich zadañ, do

jakich mo¿e byæ potrzebna baza danych. Stanowi zaplecze dla wielu aplikacji

korporacyjnych, witryn WWW i sklepów internetowych. Bogactwo funkcji i mo¿liwo�ci

to ogromna zaleta �rodowiska MySQL, jednak¿e zapamiêtanie sk³adni, parametrów

i sposobów stosowania wszystkich poleceñ i rozszerzeñ jest praktycznie niemo¿liwe.

Ka¿dy, kto chce biegle pos³ugiwaæ siê t¹ baz¹, powinien mieæ pod rêk¹ materia³y

opisuj¹ce stosowany w niej jêzyk SQL.

Ksi¹¿ka „MySQL. Opis jêzyka” to najlepsze �ród³o takich informacji. Stworzona,

zredagowana i sprawdzona przez pracowników dzia³ów pomocy i produkcji firmy

MySQL AB publikacja zawiera wszystko, co mo¿e byæ potrzebne u¿ytkownikowi bazy

danych MySQL. Przedstawia zarówno zagadnienia podstawowe, takie jak: struktura

jêzyka, typy danych i zasady konstruowania zapytañ, jak i tematy zaawansowane:

transakcje, replikacjê oraz administrowanie baz¹. Szczegó³owo opisane s¹ równie¿

wszystkie zagadnienia zwi¹zane z zaimplementowanym w niej jêzykiem SQL.

• Podstawowe informacje o MySQL

• Jêzyk SQL — instrukcje, typy danych, funkcje i operatory

• Zapytania

• Definiowanie danych

• Obs³uga transakcji

• Zarz¹dzanie kontami u¿ytkowników

• Konserwacja tabel

• Replikacja baz danych

• Rozszerzenia MySQL dla systemów GIS

• Procedury sk³adowane

• Obs³uga b³êdów

Page 2: MySQL. Opis języka

Spis treści

Rozdział 1. Informacje ogólne .............................................................................. 91.1. Na temat tego podręcznika....................................................................................... 9

1.1.1. Zasady przyjęte w tym podręczniku .......................................................... 101.2. Omówienie systemu zarządzania bazą danych MySQL......................................... 12

1.2.1. Historia MySQL ........................................................................................ 131.2.2. Główne cechy MySQL .............................................................................. 141.2.3. Stabilność MySQL .................................................................................... 171.2.4. Jak duże mogą być tabele MySQL ............................................................ 181.2.5. Zgodność z rokiem 2000 ........................................................................... 19

1.3. Omówienie MySQL AB ........................................................................................ 211.3.1. Model biznesowy i usługi MySQL AB...................................................... 221.3.2. Informacje o kontakcie .............................................................................. 25

1.4. Obsługa techniczna oraz wydawanie licencji MySQL........................................... 261.4.1. Obsługa techniczna oferowana przez MySQL AB........................................ 261.4.2. Prawa autorskie i licencje .......................................................................... 271.4.3. Licencje MySQL ....................................................................................... 281.4.4. Logo i znaki towarowe MySQL ................................................................ 30

1.5. Plany rozwoju MySQL .......................................................................................... 321.5.1. MySQL 4.0 w skrócie................................................................................ 331.5.2. MySQL 4.1 w skrócie................................................................................ 351.5.3. MySQL 5.0: następna wersja rozwojowa .................................................. 37

1.6. MySQL i przyszłość (TODO) ................................................................................ 371.6.1. Nowe mechanizmy planowane dla wersji 4.1............................................ 381.6.2. Nowe funkcje planowane dla wersji 5.0 .................................................... 381.6.3. Nowe funkcje planowane dla 5.1............................................................... 391.6.4. Nowe funkcje planowane w bliskiej przyszłości ......................................... 401.6.5. Nowe funkcje planowane w niezbyt odległej przyszłości.......................... 431.6.6. Nowe funkcje, których wdrożenia nie planujemy.......................................... 44

1.7. Źródła informacji o MySQL .................................................................................. 451.7.1. Listy dyskusyjne poświęcone MySQL ...................................................... 451.7.2. Wspomaganie środowiska MySQL na IRC (Internet Relay Chat)............. 54

1.8. Zgodność MySQL ze standardami ......................................................................... 551.8.1. Standardy spełniane przez MySQL............................................................ 561.8.2. Wybieranie trybów MySQL ...................................................................... 561.8.3. Uruchamianie MySQL w trybie ANSI ...................................................... 561.8.4. Rozszerzenia MySQL do standardu SQL .................................................. 57

Page 3: MySQL. Opis języka

4 Spis treści

1.8.5. Rozbieżności między MySQL a standardem SQL ........................................ 601.8.6. Jak MySQL radzi sobie z ograniczeniami ................................................. 671.8.7. Znane błędy i projektowe braki w MySQL................................................ 69

Rozdział 2. Struktura języka .............................................................................. 772.1. Literały................................................................................................................... 77

2.1.1. Łańcuchy ................................................................................................... 772.1.2. Liczby........................................................................................................ 802.1.3. Wartości szesnastkowe .............................................................................. 802.1.4. Wartości logiczne ...................................................................................... 812.1.5. Wartości NULL ......................................................................................... 81

2.2. Nazwy baz danych, tabel, indeksów, kolumn i aliasów ......................................... 812.2.1. Kwalifikatory identyfikatorów .................................................................. 832.2.2. Znaczenie wielkości liter w nazwach identyfikatorów .............................. 83

2.3. Zmienne definiowane przez użytkownika.............................................................. 852.4. Zmienne systemowe............................................................................................... 87

2.4.1. Strukturalne zmienne systemowe .............................................................. 892.5. Składnia komentarza .............................................................................................. 912.6. Traktowanie słów zastrzeżonych w MySQL.......................................................... 92

Rozdział 3. Obsługa zestawów znaków............................................................... 953.1. Ogólne informacje o zestawach znaków i sortowaniu ........................................... 953.2. Zestawy znaków i porządki sortowania w MySQL................................................ 963.3. Określanie domyślnego zestawu znaków i sortowania........................................... 98

3.3.1. Zestaw znaków i sortowanie dla serwera................................................... 983.3.2. Zestaw znaków i sortowanie dla bazy danych ........................................... 993.3.3. Zestaw znaków i sortowanie dla tabeli .................................................... 1003.3.4. Zestaw znaków i sortowanie dla kolumny............................................... 1003.3.5. Przykłady przypisywania zestawu znaków i sortowania ......................... 1013.3.6. Zestawy znaków i sortowanie dla połączenia .......................................... 1023.3.7. Zestaw znaków i sortowanie dla łańcucha znaków.................................. 1043.3.8. Wykorzystywanie COLLATE w instrukcjach SQL .................................... 1053.3.9. Priorytet klauzuli COLLATE .................................................................. 106

3.3.10. Operator BINARY................................................................................... 1063.3.11. Niektóre przypadki specjalne, w których trudno określić sortowanie...... 1063.3.12. Sortowania muszą być odpowiednie dla danego zestawu znaków........... 1073.3.13. Przykład wpływu porządku sortowania ................................................... 108

3.4. Operacje, na które ma wpływ obsługa zestawów znaków.................................... 1093.4.1. Łańcuchy wyjściowe ............................................................................... 1093.4.2. CONVERT()............................................................................................ 1103.4.3. CAST() .................................................................................................... 1103.4.4. Instrukcje SHOW .................................................................................... 111

3.5. Obsługa Unicode.................................................................................................. 1123.6. UTF8 dla metadanych.......................................................................................... 1133.7. Kompatybilność z innymi systemami zarządzania bazą danych .......................... 1153.8. Nowy format pliku konfiguracji zestawu znaków................................................ 1153.9. Narodowe zestawy znaków.................................................................................. 1153.10. Aktualizacja zestawów znaków z MySQL 4.0..................................................... 116

3.10.1. Zestawy znaków w wersji 4.0 i odpowiadające im w wersji 4.1 paryskładające się z zestawu znaków i sortowania......................................... 117

3.10.2. Przekształcanie kolumn znakowych wersji 4.0 na format 4.1 ................. 1183.11. Zestawy znaków i sortowania obsługiwane przez MySQL.................................. 118

3.11.1. Zestawy znaków standardu Unicode ....................................................... 1193.11.2. Zestawy znaków zachodnioeuropejskich................................................. 1203.11.3. Zestawy znaków dla Europy Centralnej .................................................. 121

Page 4: MySQL. Opis języka

Spis treści 5

3.11.4. Zestawy znaków południowoeuropejskich i środkowowschodnich......... 1223.11.5. Zestawy znaków regionu bałtyckiego...................................................... 1233.11.6. Zestawy znaków dla cyrylicy................................................................... 1233.11.7. Azjatyckie zestawy znaków..................................................................... 124

Rozdział 4. Typy kolumn .................................................................................. 1254.1. Przegląd typów dla kolumny................................................................................ 126

4.1.1. Omówienie typów liczbowych ................................................................ 1264.1.2. Przegląd typów związanych z datą i czasem............................................ 1294.1.3. Przegląd typów łańcuchowych ................................................................ 130

4.2. Typy liczbowe...................................................................................................... 1324.3. Typy związane z datą i czasem ............................................................................ 135

4.3.1. Typy DATETIME, DATE i TIMESTAMP............................................. 1374.3.2. Typ TIME................................................................................................ 1424.3.3. Typ YEAR............................................................................................... 1434.3.4. Problem roku 2000 a typy związane z datą.............................................. 144

4.4. Typy łańcuchowe ................................................................................................. 1444.4.1. Typy CHAR i VARCHAR ...................................................................... 1444.4.2. Typy BLOB i TEXT................................................................................ 1464.4.3. Typ Enum ................................................................................................ 1474.4.4. Typ SET .................................................................................................. 149

4.5. Rozmiar pamięci potrzebnej dla typów kolumn................................................... 1514.6. Wybieranie odpowiedniego typu dla kolumny..................................................... 1524.7. Wykorzystywanie typów kolumn z innych mechanizmów baz danych ............... 153

Rozdział 5. Funkcje i operatory ........................................................................ 1555.1. Operatory ............................................................................................................. 156

5.1.1. Nawiasy ................................................................................................... 1565.1.2. Operatory porównania ............................................................................. 1565.1.3. Operatory logiczne .................................................................................. 1615.1.4. Operatory rozróżniania wielkości liter..................................................... 163

5.2. Funkcje kontroli przepływu ................................................................................. 1635.3. Funkcje łańcuchowe............................................................................................. 166

5.3.1. Funkcje porównywania łańcuchów.......................................................... 1765.4. Funkcje liczbowe ................................................................................................. 178

5.4.1. Operatory arytmetyczne........................................................................... 1785.4.2. Funkcje matematyczne ............................................................................ 180

5.5. Funkcje daty i godziny......................................................................................... 1865.6. Funkcje obsługi wyszukiwania pełnotekstowego................................................. 202

5.6.1. Boolowskie wyszukiwania pełnotekstowe............................................... 2055.6.2. Wyszukiwania pełnotekstowe z rozwijaniem zapytania .......................... 2075.6.3. Ograniczenia dla wyszukiwania pełnotekstowego................................... 2085.6.4. Modyfikowanie wyszukiwania pełnotekstowego MySQL ...................... 2095.6.5. Lista rzeczy do zrobienia dla wyszukiwania pełnotekstowego................ 211

5.7. Funkcje konwersji typów ..................................................................................... 2115.8. Inne funkcje ......................................................................................................... 214

5.8.1. Funkcje bitowe ........................................................................................ 2145.8.2. Funkcje szyfrujące................................................................................... 2155.8.3. Funkcje informacyjne .............................................................................. 2195.8.4. Funkcje różne .......................................................................................... 223

5.9. Funkcje i modyfikatory do zastosowania z klauzulami GROUP BY................... 2265.9.1. Funkcje GROUP BY (agregujące)........................................................... 2265.9.2. Modyfikatory GROUP BY...................................................................... 2295.9.3. GROUP BY z ukrytymi polami............................................................... 232

Page 5: MySQL. Opis języka

6 Spis treści

Rozdział 6. Składnia instrukcji SQL .................................................................. 2356.1. Instrukcje operujące na danych ............................................................................ 235

6.1.1. Składnia instrukcji DELETE ................................................................... 2356.1.2. Składnia instrukcji DO ............................................................................ 2386.1.3. Składnia instrukcji HANDLER ............................................................... 2386.1.4. Składnia instrukcji INSERT .................................................................... 2406.1.5. Składnia instrukcji LOAD DATA INFILE.............................................. 2466.1.6. Składnia instrukcji REPLACE................................................................. 2556.1.7. Składnia instrukcji SELECT.................................................................... 2566.1.8. Składnia podzapytań................................................................................ 2656.1.9. Składnia instrukcji TRUNCATE ............................................................. 276

6.1.10. Składnia instrukcji UPDATE................................................................... 2766.2. Instrukcje definiowania danych ........................................................................... 278

6.2.1. Składnia instrukcji ALTER DATABASE ............................................... 2786.2.2. Składnia instrukcji ALTER TABLE........................................................ 2796.2.3. Składnia instrukcji CREATE DATABASE............................................. 2856.2.4. Składnia instrukcji CREATE INDEX ..................................................... 2856.2.5. Składnia instrukcji CREATE TABLE ..................................................... 2876.2.6. Składnia instrukcji DROP DATABASE.................................................. 3016.2.7. Składnia instrukcji DROP INDEX .......................................................... 3026.2.8. Składnia instrukcji DROP TABLE.......................................................... 3026.2.9. Składnia instrukcji RENAME TABLE.................................................... 303

6.3. Instrukcje programu MySQL ............................................................................... 3046.3.1. Składnia instrukcji DESCRIBE

(odczytywanie informacji na temat kolumn) ........................................... 3046.3.2. Składnia instrukcji USE........................................................................... 304

6.4. Instrukcje obsługi transakcji i blokowania ........................................................... 3056.4.1. Składnia instrukcji START TRANSACTION, COMMIT

oraz ROLLBACK.................................................................................... 3056.4.2. Instrukcje niemożliwe do wycofania ....................................................... 3066.4.3. Instrukcje wykonujące niejawne zatwierdzenie......................................... 3066.4.4. Składnia instrukcji SAVEPOINT i ROLLBACK TO SAVEPOINT....... 3076.4.5. Składnia instrukcji LOCK TABLES oraz UNLOCK TABLES .............. 3076.4.6. Składnia instrukcji SET TRANSACTION .............................................. 310

6.5. Administracja bazą danych .................................................................................. 3116.5.1. Instrukcje zarządzające kontami użytkowników ....................................... 3116.5.2. Instrukcje do konserwacji tabel ............................................................... 3196.5.3. Składnia instrukcji SET i SHOW ............................................................ 3266.5.4. Inne instrukcje administracyjne ............................................................... 347

6.6. Instrukcje replikacji.............................................................................................. 3526.6.1. Instrukcje SQL sterujące serwerem głównym ......................................... 3526.6.2. Instrukcje SQL sterujące serwerami podrzędnymi .................................. 354

Rozdział 7. Rozszerzenia przestrzenne w MySQL............................................... 3657.1. Wstęp ................................................................................................................... 3657.2. Model geometryczny OpenGIS............................................................................ 366

7.2.1. Hierarchia klas geometrycznych.............................................................. 3667.2.2. Klasa Geometry ....................................................................................... 3687.2.3. Klasa Point .............................................................................................. 3697.2.4. Klasa Curve ............................................................................................. 3697.2.5. Klasa LineString ...................................................................................... 3707.2.6. Klasa Surface........................................................................................... 3707.2.7. Klasa Polygon.......................................................................................... 3707.2.8. Klasa GeometryCollection....................................................................... 371

Page 6: MySQL. Opis języka

Spis treści 7

7.2.9. Klasa MultiPoint...................................................................................... 3717.2.10. Klasa MultiCurve .................................................................................... 3727.2.11. Klasa MultiLineString ............................................................................. 3727.2.12. Klasa MultiSurface .................................................................................. 3727.2.13. Klasa MultiPolygon................................................................................. 373

7.3. Obsługiwane formaty danych przestrzennych...................................................... 3737.3.1. Format tekstowy WKT ............................................................................ 3747.3.2. Format binarny WKB .............................................................................. 374

7.4. Tworzenie bazy danych z rozszerzeniami przestrzennymi................................... 3757.4.1. Typy danych przestrzennych w MySQL ................................................. 3757.4.2. Tworzenie wartości przestrzennych......................................................... 3767.4.3. Tworzenie kolumn przestrzennych .......................................................... 3797.4.4. Wypełnianie kolumn przestrzennych....................................................... 3797.4.5. Pobieranie danych przestrzennych........................................................... 381

7.5. Analiza informacji przestrzennych....................................................................... 3817.5.1. Funkcje konwersji formatów geometrycznych ........................................ 3827.5.2. Funkcje klasy Geometry .......................................................................... 3827.5.3. Funkcje tworzące nowe geometrie na podstawie istniejących ................. 3887.5.4. Funkcje testujące relacje przestrzenne

między obiektami geometrycznymi ......................................................... 3897.5.5. Relacje między minimalnymi prostokątami otaczającymi

dla poszczególnych geometrii.................................................................. 3907.5.6. Funkcje sprawdzające relacje przestrzenne pomiędzy geometriami ........ 391

7.6. Optymalizacja analizy przestrzennej.................................................................... 3927.6.1. Tworzenie indeksów przestrzennych....................................................... 3927.6.2. Wykorzystanie indeksu przestrzennego................................................... 393

7.7. Zgodność MySQL ze standardem ........................................................................ 3957.7.1. Niezaimplementowane funkcje GIS ........................................................ 395

Rozdział 8. Procedury i funkcje składowane ..................................................... 3978.1. Składnia procedur składowanych......................................................................... 398

8.1.1. Utrzymanie procedur składowanych........................................................ 3988.1.2. SHOW PROCEDURE STATUS oraz SHOW FUNCTION STATUS.... 4018.1.3. Instrukcja CALL...................................................................................... 4028.1.4. Instrukcja złożona BEGIN ... END.......................................................... 4028.1.5. Instrukcja DECLARE.............................................................................. 4028.1.6. Zmienne w procedurach składowanych................................................... 4028.1.7. Warunki i podprogramy obsługi .............................................................. 4038.1.8. Kursory.................................................................................................... 4058.1.9. Konstrukcje sterowania przepływem sterowania..................................... 406

Rozdział 9. Obsługa błędów w MySQL .............................................................. 4099.1. Zwracane błędy.................................................................................................... 4099.2. Komunikaty błędów............................................................................................. 419

Dodatek A Rozwiązywanie problemów z zapytaniami ........................................435A.1. Zagadnienia związane z zapytaniami ................................................................... 435

A.1.1. Wielkość liter przy wyszukiwaniu........................................................... 435A.1.2. Problemy z kolumnami typu DATE ........................................................ 436A.1.3. Problemy z wartościami NULL............................................................... 437A.1.4. Problemy z synonimami kolumn ............................................................. 438A.1.5. Błąd wycofania dla tabel nietransakcyjnych............................................ 439A.1.6. Usuwanie wierszy ze związanych tabel ................................................... 439A.1.7. Rozwiązywanie problemów z brakującymi wierszami ............................ 440A.1.8. Problemy z porównaniami zmiennoprzecinkowymi................................ 441

Page 7: MySQL. Opis języka

8 Spis treści

A.2. Problemy związane z optymalizatorem................................................................ 443A.3. Problemy z definicją tabel.................................................................................... 444

A.3.1. Problemy z instrukcją ALTER TABLE................................................... 444A.3.2. Jak zmienić porządek kolumn w tabeli .................................................... 445A.3.3. Problemy z tabelami tymczasowymi ....................................................... 445

Dodatek B Wyrażenia regularne w MySQL........................................................ 447

Skorowidz...................................................................................... 451

Page 8: MySQL. Opis języka

Rozdział 4.

Typy kolumn

W MySQL dostępnych jest wiele typów danych, które można pogrupować w kilku pod-stawowych kategoriach, takich jak typy liczbowe, typy związane z datą i czasem oraztypy łańcuchowe. Na początku tego rozdziału przedstawiony zostanie przegląd wspo-mnianych przed chwilą typów kolumn, po czym nastąpi bardziej szczegółowy opis ichwłaściwości z podziałem na poszczególne kategorie i wreszcie zamieszczone zostaniepodsumowanie informacji dotyczących wymagań co do rozmiaru pamięci potrzebnejdo przechowania danej kolumny. Sam przegląd jest z zamierzenia krótki. Dodatkoweinformacje o poszczególnych typach kolumn, na przykład dopuszczalny format, w któ-rym można deklarować wartości, zostały uwzględnione w szczegółowych omówieniach.

Od wersji 4.1 MySQL rozpoznaje rozszerzenia do obsługi danych przestrzennych.Informacje o typach przestrzennych znajdują się w rozdziale 7. tego podręcznika.

W części opisu typów kolumn zastosowane zostały następujące reguły:

� �

Wskazuje maksymalny rozmiar wyświetlania liczby lub łańcucha.Maksymalnym dopuszczalnym rozmiarem wyświetlania jest 255.

� �

Dotyczy typów zmiennoprzecinkowych i stałoprzecinkowych. Określa liczbęcyfr po kropce dziesiętnej. Maksymalna dopuszczalna wartość wynosi 30,ale nie powinna przekraczać ���.

� Nawiasy kwadratowe (� �) identyfikują opcjonalne fragmenty deklaracji typu.

Page 9: MySQL. Opis języka

126 Rozdział 4. ♦ Typy kolumn

4.1. Przegląd typów dla kolumny

4.1.1. Omówienie typów liczbowych

Poniżej znajduje się przegląd liczbowych typów dla kolumn. Bardziej szczegółoweinformacje można znaleźć w podrozdziale 4.2. Wymogi dotyczące rozmiaru pamięcipotrzebnej do przechowywania kolumn znajdują się w podrozdziale 4.5.

Jeśli dla kolumny liczbowej zostanie określony atrybut ������, MySQL automatyczniedoda do kolumny atrybut � �� ��.

Należy uważać podczas odejmowania dwóch wartości liczbowych, z których jedna ma

typ � �� ��. Uzyskany wynik będzie również tego typu! — patrz podrozdział 5.7.

� � � ��������� �� ������������

Bardzo mała liczba całkowita. Dla liczb ze znakiem zakres wynosi od ����do ���. W przypadku liczb bez znaku zakres obejmuje wartości od � do ���.

� ��, ����, ������

To są synonimy � � ����. Synonim ������ został dodany w MySQL 4.1.0.Wartość zerowa to inaczej fałsz. Wartości niezerowe traktowane są jako prawda.

W przyszłości wprowadzona zostanie pełna, zgodna ze standardem SQLobsługa typu boolowskiego.

� ����� ��������� �� ������������

Mała liczba całkowita. Dla liczb ze znakiem zakres wynosi od ������do �����. W przypadku liczb bez znaku zakres obejmuje wartości od � do �����.

� ����� ��������� �� ������������

Średnia liczba całkowita. Dla liczb ze znakiem zakres wynosi od ��������do �������. W przypadku liczb bez znaku zakres obejmuje wartości od �do ��������.

� ��������� �� ������������

Standardowa liczba całkowita. Dla liczb ze znakiem zakres wynosiod ��� � ��� � do �� � ��� �. W przypadku liczb bez znaku zakresobejmuje wartości od � do �! !���!�.

� ������������� �� ������������

Jest to synonim dla typu �.

� �� ��������� �� ������������

Duża liczba całkowita. Dla liczb ze znakiem zakres wynosiod �!����������� �������do !����������� ������. W przypadku liczbbez znaku zakres obejmuje wartości od � do �� �� �����!������.

Page 10: MySQL. Opis języka

4.1. Przegląd typów dla kolumny 127

Oto kilka spraw, o których należy wiedzieć odnośnie kolumn typu �� �:

� Wszystkie obliczenia wykonywane są przy użyciu wartości typu �� �lub ������ ze znakiem. Oznacza to, że dużych liczb całkowitych bezznaku, większych niż !����������� ������ (63 bity), można używać tylkoz funkcjami bitowymi! Niezastosowanie się do tej zasady może doprowadzićdo uzyskania w wyniku liczby, której kilka ostatnich cyfr jest błędnychz powodu błędów w zaokrąglaniu podczas konwersji wartości �� �na ������.

� MySQL 4.0 potrafi obsługiwać �� � w następujących przypadkach:

� Podczas wykorzystywania liczb całkowitych do przechowywaniadużych wartości bez znaku w kolumnie typu �� �.

� W � ��������� lub ��"���������, gdzie ������� odnosi siędo kolumny �� �.

� Podczas korzystania z operatorów (między innymi #, �, $), gdy obaargumenty są liczbami całkowitymi.

� Zawsze istnieje możliwość zapisania w kolumnie �� � dokładnej wartościliczby całkowitej. Wystarczy zapisać ją przy użyciu łańcucha. W takimprzypadku zostanie dokonana konwersja łańcucha na liczbę; konwersjanie będzie wymagać pośredniego etapu przekształcającego liczbę na jejodpowiednik o podwójnej precyzji.

� Podczas korzystania z operatorów #, � i $ stosowana jest arytmetyka�� �, jeśli oba argumenty mają wartość liczby całkowitej! To oznacza,że pomnożenie dwóch dużych liczb całkowitych (lub wyników funkcji,która zwraca liczby całkowite) może spowodować nieoczekiwanerezultaty, jeśli wynik przekroczy liczbę !����������� ������.

� ���������� �� ������������

Liczba zmiennoprzecinkowa. Parametr � oznacza precyzję i może przyjmowaćwartość od 0 do 14 dla liczb zmiennoprzecinkowych o dokładności do jednegoznaku i od 25 do 53 dla liczb zmiennoprzecinkowych o dokładności do dwóchznaków. To przypomina opisane poniżej typy ���� i ������. Typ �������ma ten sam zakres, jaki posiadają odpowiadające mu typy ���� i ������,ale w jego przypadku niezdefiniowany jest maksymalny rozmiar wyświetlaniai liczba miejsc po przecinku.

Od wersji 3.23 MySQL jest to prawdziwa wartość zmiennoprzecinkowa.W wersjach wcześniejszych liczba typu ������� była zawsze liczbą o dwóchmiejscach po przecinku.

Ta składnia została dodana w celu zachowania zgodności ze standardem ODBC.

Stosowanie typu ���� może spowodować wystąpienie pewnychnieoczekiwanych problemów, ponieważ wszystkie obliczenia w MySQLsą wykonywane z podwójną precyzją patrz punkt A.1.7).

� �������%������� �� ������������

Page 11: MySQL. Opis języka

128 Rozdział 4. ♦ Typy kolumn

Mała liczba zmiennoprzecinkowa (o dokładności do jednego znaku). Liczbata może przyjąć wartości: od ��& ����� ���#�� do ��&��� ! �������, �,i od �&��� ! ������� do �& ����� ���#��. Jeśli podany jest atrybut � �� ��,niedozwolone są wartości ujemne. Parametr ��definiuje maksymalną szerokośćwyświetlanej liczby, a � liczbę miejsc po przecinku. Typ ���� bez argumentówlub typ ������� (gdzie ��jest liczbą z zakresu od 0 do 24) oznacza liczbęzmiennoprzecinkową o pojedynczej precyzji.

� ���������%������� �� ������������

Standardowa liczba zmiennoprzecinkowa (o dokładności do dwóchznaków). Liczba ta może przyjąć wartości: od ��&�!��!��� ��������#���do ��&��������������� �����, �, i od �&��������������� �����do �&�!��!��� ��������#���. Jeśli podany jest atrybut � �� ��, wartościujemne są niedozwolone. Parametr ��definiuje maksymalną szerokośćwyświetlanej liczby, a � — liczbę miejsc po przecinku. Typ ������bez argumentów lub ������� (gdzie � jest liczbą z zakresu od 25 do 53)oznacza liczbę zmiennoprzecinkową o podwójnej precyzji.

� �������'��(�� ���%������� �� ������������

�������%������� �� ������������

Są to synonimy ������. Wyjątek: Jeśli dla parametru )*+,-./0 serwerawłączono opcję ����,��,����, synonimem ���� jest ����, a nie ������.

� ��(�������%�������� �� ������������

Niezapakowana liczba stałoprzecinkowa. Zachowanie kolumny tego typuprzypomina kolumnę typu (1��. „Niezapakowana” oznacza, że liczba jestprzechowywana w postaci łańcucha przy użyciu jednego znaku na każdą cyfręwartości. Parametr � definiuje maksymalną liczbę cyfr, a � — liczbę miejscpo przecinku. W parametrze � nie są brane pod uwagę: kropka dziesiętna(odpowiadająca w naszej notacji przecinkowi) i (dla liczb ujemnych) znak �,choć jest dla nich zarezerwowane miejsce. Wartości nie mają miejscpo przecinku lub części ułamkowych, jeśli � jest równe 0. Maksymalny zakreswartości typu ��(��� jest taki sam, jak dla typu ������, ale rzeczywisty zakresdanej kolumny ��(��� może być ograniczony przez wybór argumentów � i �.Jeśli podany jest atrybut � �� ��, wartości ujemne są niedozwolone.

W przypadku braku argumentu �, domyślną wartością jest 0. Jeśli pominiętyjest parametr �, domyślną wartością jest 10.

W wersjach poprzedzających MySQL 3.23 argument � musi być wystarczającoduży, by zawierał obszar potrzebny dla znaku i kropki dziesiętnej.

� ��(����%������� �� ������������

����(����%������� �� ������������

"������%�������� �� ������������

Są to synonimy typu ��(���.

W MySQL 4.1.0 dodano synonim "�� w celu osiągnięcia kompatybilnościz innymi serwerami.

Page 12: MySQL. Opis języka

4.1. Przegląd typów dla kolumny 129

4.1.2. Przegląd typów związanych z datą i czasem

Poniżej znajduje się podsumowanie typów kolumn przeznaczonych dla czasu i daty.Dodatkowe informacje na ten temat można znaleźć w podrozdziale 4.3. Wymogi do-tyczące pamięci potrzebnej do przechowywania danych w kolumnach zostały podanew podrozdziale 4.5.

� ����

Data. Obsługiwany zakres obejmuje daty od 2����������2 do 2!!!!������2.W MySQL wartości ���� wyświetlane są w formacie 2����������2, ale możnaprzypisywać wartości do kolumn ���� przy użyciu łańcuchów lub liczb.

� �������

Kombinacja daty i czasu. Obsługiwany zakres obejmuje wartościod 2�������������3��3��2 do 2!!!!���������3�!3�!2. W MySQL wartości������� wyświetlane są w formacie 2�������������3��3��2, ale możnaprzypisywać wartości do kolumn ������� przy użyciu łańcuchów lub liczb.

� �������'�����

Znacznik czasu. Obsługiwany zakres rozpoczyna się od daty 2�!��������2i sięga roku ����.

Kolumna typu �������' przydaje się do rejestracji daty i godziny operacjiwstawiania lub aktualizacji. Pierwszej kolumnie �������' w tabeliautomatycznie przypisywana jest data i czas ostatniej operacji, jeśli tylko tychwartości nie wprowadzi ręcznie użytkownik. Dowolnej kolumnie �������'można również przypisać bieżącą datę i godzinę, wpisując do niej wartość ���.

Od MySQL 4.1 wartości �������' są zwracane w postaci łańcuchóww formacie 2�������������3��3��2. Aby uzyskać wartość w postaci liczby,należy dodać do kolumn tego typu #�. Inne szerokości wyświetlaniaznacznika czasu nie są obsługiwane.

W wersjach poprzedzających MySQL 4.1 wartości �������' są wyświetlanew formacie ��������������, ������������, �������� lub ������ w zależnościod tego, czy parametr � jest równy 14 (albo go brak), 12, 8 lub 6. Można jednakprzypisywać wartości do kolumn �������' przy użyciu łańcuchów lub liczb.Argument � wpływa tylko na sposób wyświetlania kolumny �������', a niena jej przechowywanie. Wartości kolumny są zawsze zapisywane w czterechbajtach. W MySQL od wersji 4.0.12 pojawiła się opcja ��405, dzięki którejmożna zmienić działanie serwera, upodabniając je do MySQL 4.1.

Należy odnotować, że kolumny �������'���, gdzie ��jest równe 8 lub 14,są traktowane jako liczby, natomiast reszta kolumn �������'��� jesttraktowana jako łańcuchy. Jest to rodzaj gwarancji, że użytkownik będziemógł wiarygodnie usuwać i przywracać tabele tego typu.

� ���

Godzina. Obsługiwany zakres obejmuje wartości od 2����3�!3�!2do 2 ���3�!3�!2. W MySQL wartości ��� wyświetlane są w formacie2 ��3��3��2, ale można przypisać wartości do kolumn ��� przy użyciuzarówno łańcuchów, jak i liczb.

Page 13: MySQL. Opis języka

130 Rozdział 4. ♦ Typy kolumn

� �������6 ��

Rok w formacie dwu- lub czterocyfrowym. Domyślnym formatem jest rokzapisany za pomocą czterech cyfr. W tym formacie dostępne wartości należądo przedziału od �!�� do ���� oraz �. W formacie dwucyfrowym wartościdopuszczalne to liczby z zakresu od �� do �!, które reprezentują daty od roku1970 do 2069. W MySQL wartości ���� wyświetlane są w formacie ����,ale można przypisać wartości do kolumn ���� przy użyciu tak łańcuchów,jak i liczb. Typ ���� jest niedostępny dla wersji wcześniejszych niż MySQL 3.22.

4.1.3. Przegląd typów łańcuchowych

Poniżej znajduje się przegląd typów łańcuchowych. Dodatkowe informacje możnaznaleźć w podrozdziale 4.4. Wymogi dotyczące pamięci potrzebnej do przechowywa-nia danych w kolumnach zostały podane w podrozdziale 4.5.

W niektórych przypadkach MySQL może zmienić kolumnę typu łańcuchowego na typ,który będzie się różnił od zadeklarowanego w instrukcji (����������� lub �����������.Więcej informacji na ten temat znajduje się w podpunkcie 6.2.5.2.

Od wersji 4.1 w MySQL pojawiła się zmiana, która wpływa na wiele typów kolumn typułańcuchowego. Definicja kolumn typu znakowego może zawierać atrybut (1���(������, który określa zestaw znaków i opcjonalnie porządek sortowania. Dotyczy to typów(1��, 7��(1��, różnych typów ��"� oraz � �� i ���, na przykład:

�������������������� ������� ����������������������� ������� �������������������������������������

Ta definicja tabeli tworzy kolumnę o nazwie 8� z zestawem znaków 9:;� i z domyśl-nym sortowaniem dla tego zestawu znaków oraz kolumnę 8� z zestawem znaków +<:=4�i jego binarnym sortowaniem. Podczas sortowania binarnego nie jest brana pod uwagęwielkość liter.

Sortowanie i porównywanie kolumn typu znakowego jest wykonywane na podstawiezestawu znaków, który jest przypisany do kolumny. W wersjach poprzedzającychMySQL 4.1 wspomniane operacje bazują na porządku sortowania zestawu znakówserwera. Dla kolumn (1�� i 7��(1�� można zadeklarować kolumnę z atrybutem � ���,aby spowodować sortowanie i porównywanie rozróżniające wielkość liter przy użyciuwartości liczbowych kodu, a nie porządkowania leksykograficznego.

Więcej szczegółów na ten temat można znaleźć w rozdziale 3.

Dodatkowo, od wersji 4.1 MySQL interpretuje deklaracje długości przechowywanychdanych w definicjach kolumn typu znakowego w znakach (w wersjach wcześniejszychinterpretowanie wykonywane było w bajtach).

Oto dostępne w MySQL typy łańcuchowe:

Page 14: MySQL. Opis języka

4.1. Przegląd typów dla kolumny 131

� � ��� ����(1��������� ����6���(�6�� (����

Łańcuch o stałej długości, który jest zawsze w celu przechowania dopełnianypo prawej stronie odpowiednią liczbą spacji. Parametr � reprezentuje długośćkolumny. Zakres � wynosi od 0 do 255 znaków (w wersjach poprzedzającychMySQL 3.23 był to przedział od 1 do 255).

Końcowe spacje zostają usunięte w czasie pobierania wartości (1��.

Od MySQL 4.1.0 kolumna (1�� o specyfikacji długości przekraczającej 255zostanie przekształcona na najmniejszy typ ��"�, który może przechowywaćwartości takiej długości. Wartość (1������� zostanie na przykład przekształconana typ ��"�, zaś (1���������� na typ �������"�. Jest to spowodowanewymogami kompatybilności. Jednak taka konwersja wpływa na kolumny,które stają się kolumnami zmiennej długości, a także powoduje usuwaniekońcowych spacji.

Słowo kluczowe (1�� to skrót od (1���(���. Typ ��� ���(1��(lub odpowiadająca mu forma skrócona (1��) to należąca do standardu SQLmetoda definiowania, opierająca się na założeniu, że kolumna (1�� powinnaużyć domyślnego zestawu znaków. W MYSQL to ustawienie jest domyślne.

Atrybut � ��� powoduje rozróżnianie wielkości liter podczas operacjisortowania i porównywania.

Od MySQL 4.1.0 można określać atrybut ��(. Powoduje on przypisaniedo kolumny typu (1�� zestawu znaków +<:=4�.

Od wersji 4.1.1 MySQL można także podawać atrybut � (���. Powoduje onprzypisanie do kolumny (1�� zestawu znaków 9>)�.

MySQL pozwala tworzyć kolumnę typu (1�����. Jest to szczególnie przydatne,w sytuacjach gdy zachodzi potrzeba osiągnięcia zgodności z jakimiśstarymi aplikacjami, które zależą od istnienia kolumny, choć samej wartościw rzeczywistości nie używają. Jest to również praktyczne, gdy potrzebna jestkolumna, która może przyjąć tylko dwie wartości: kolumna (1�����, jeślinie zostanie zdeklarowana jako ��� ���, zajmuje tylko jeden bit i możeprzybierać tylko wartości ��� i 22 (pusty łańcuch).

� (1��

Jest to synonim typu (1�����.

� � ��� ����7��(1��������� ����

Łańcuch o zmiennej długości. Parametr � reprezentuje maksymalną długośćkolumny. Zakres � wynosi od 0 do 255 znaków (w wersjach wcześniejszychod MySQL 4.0.2 wynosił od 1 do 255).

Końcowe spacje zostają usunięte w momencie zapisywania wartości 7��(1��, conie jest zgodne ze specyfikacją standardu SQL.

Page 15: MySQL. Opis języka

132 Rozdział 4. ♦ Typy kolumn

Od MySQL 4.1.0 kolumna 7��(1�� o specyfikacji długości przekraczającej 255zostanie przekształcona na najmniejszy typ ��"�, który może przechowywaćwartości takiej długości. Wartość 7��(1������� zostanie na przykładprzekształcona na typ ��"�, natomiast 7��(1���������� na typ �������"�.Jest to spowodowane wymogami kompatybilności. Taka konwersja wpływajednak na usuwanie końcowych spacji.

Słowo kluczowe 7��(1�� jest skrótem od słów (1���(����7��� �.

Atrybut � ��� powoduje rozróżnianie wielkości liter podczas operacjisortowania i porównywania.

� � �����, � ���"�

Kolumna ���� lub ��"� z maksymalną długością wynoszącą 255 (28−1) znaków.

� ����, ��"�

Kolumna ���� lub ��"� z maksymalną długością wynoszącą 65 535 (216−1)

znaków.

� ���������, �������"�

Kolumna ���� lub ��"� z maksymalną długością wynoszącą 16 777 215 (224−1)

znaków.

� �� �����, �� ���"�

Kolumna ���� lub ��"� z maksymalną długością wynoszącą 4 294 967 295lub 4 GB (232

−1) znaków. Do wersji 3.23 MySQL protokół klient-serweri tabele �?��� miały nałożone ograniczenie do 16 MB na pakiet komunikacyjnyi wiersz tabeli. Od MySQL 4.0 maksymalna dopuszczalna długość kolumn�� ����� lub �� ���"� zależy od skonfigurowanego maksymalnego rozmiarupakietu w protokole klient-serwer i dostępnej pamięci.

� � ���2�� ����2%2�� ����2%&&&�

Wyliczenie. Obiekt łańcuchowy, który może składać się tylko z jednej, wybranejz listy, wartości: 2�� ����2, 2�� ����2, &&&, ��� lub specjalnej wartościbłędu 22. Kolumna � �� może zawierać maksymalnie do 65 535 różnychwartości. Elementy � �� są reprezentowane wewnętrznie jako liczby całkowite.

� ����2�� ����2%2�� ����2%&&&�

Zbiór. Obiekt łańcuchowy, który może składać się dowolnej liczby wartości,z których każda musi pochodzić z listy wartości 2�� ����2, 2�� ����2, &&&.Kolumna ��� może liczyć maksymalnie 64 elementy. Wartości ���są reprezentowane wewnętrznie jako liczby całkowite.

4.2. Typy liczboweMySQL obsługuje wszystkie liczbowe typy danych standardu SQL. Są to dokładnetypy liczbowe danych ( �����, ����� �, ��(��� i ����(), jak również przybliżone(����, ���� i ������ '��(�� ). Słowo kluczowe � jest synonimem dla typu �����,natomiast słowo kluczowe ��( jest synonimem typu ��(���.

Page 16: MySQL. Opis języka

4.2. Typy liczbowe 133

Jako rozszerzenie do standardu SQL, MySQL obsługuje również między innymi takietypy dla liczb całkowitych jak � � �, ����� � i �� �. Zostało to przedstawionew poniższym zestawieniu.

Typ BajtyWartość minimalna

(ze znakiem)Wartość maksymalna

(ze znakiem)

��� ��� � !��� ��"

�#������ � !$�"%� $�"%"

#�&�'#��� $ !�$��%�� �$��%�"

��� ( !��("(�$%(� ��("(�$%("

��)��� � !*��$$"��$%�+(""+��� *��$$"��$%�+(""+��"

MySQL posiada także rozszerzenie służące do opcjonalnego określania dla liczby całko-witej maksymalnej szerokości wyświetlania, której wartość podawana jest w nawiasachpo słowie kluczowym nazwy typu (na przykład �� �). Pozwala to z lewej strony uzu-pełniać spacjami wyświetlane wartości o szerokości mniejszej niż szerokość określonadla kolumny.

Szerokość wyświetlania nie ogranicza zakresu wartości, które można przechowywaćw kolumnie, ani też liczby wyświetlanych cyfr tych wartości, których szerokość prze-kroczy maksimum określone dla kolumny.

Jeśli wraz z opcjonalnym rozszerzeniem użyty zostanie atrybut ������, domyślne do-pełnianie spacjami zostanie zastąpione zerami. Dla kolumny zadeklarowanej na przykładjako �����������, wartość po pobraniu będzie miała postać ���� . Należy zauwa-żyć, że w przypadku przechowywania w kolumnie typu liczby całkowitej wartości, któ-ra przekracza szerokość wyświetlania, może wystąpić problem podczas generowaniaprzez MySQL tymczasowej tabeli dla pewnych skomplikowanych złączeń. W takichwypadkach zakłada się, że dane zmieściły się w oryginalnej szerokości kolumny.

Wszystkie typy dla liczb całkowitych mogą opcjonalnie korzystać z (niestandardowe-go) atrybutu � �� ��. Wartość bez znaku można stosować w sytuacjach, gdy chcemydopuścić w kolumnie tylko liczby nieujemne, ale potrzebujemy wyższej górnej granicyzakresu liczbowego.

Od MySQL 4.0.2 atrybut � �� �� można także określać dla typów zmiennoprzecin-kowych i stałoprzecinkowych. Podobnie jak w przypadku typów dla liczb całkowitych,atrybut ten zapobiega przechowywaniu w kolumnie wartości ujemnych. Jednak w prze-ciwieństwie do typów dla liczb całkowitych górna granica zakresu wartości kolumnypozostaje bez zmian.

Jeśli dla kolumny liczbowej określony zostanie atrybut ������, MySQL automatyczniedoda do kolumny atrybut � �� ��.

Typy ��(��� i ����( implementowane są w MySQL jako ten sam typ. Służą doprzechowywania wartości, dla których ważne jest zachowanie dokładności, takich jakdane walutowe. Podczas deklarowania kolumny jednego z tych typów można określić(i zazwyczaj się to robi) dokładność oraz skalę, na przykład:

,-�./��&���#��+���

Page 17: MySQL. Opis języka

134 Rozdział 4. ♦ Typy kolumn

W tym przykładzie 5 jest dokładnością, a 2 skalą. Dokładność oznacza tutaj precyzyjneokreślenie liczby przechowywanych dla wartości znaczących cyfr dziesiętnych, a skala— liczby przechowywanych cyfr po kropce dziesiętnej.

MySQL przechowuje wartości ��(��� i ����( w postaci łańcuchów, a nie binarnychliczb zmiennoprzecinkowych. Pozwala to zachować ich dokładność dziesiętną. Każdacyfra wartości, kropka dziesiętna (jeśli skala jest większa niż zero) i znak minusa (dlaliczb ujemnych) jest reprezentowany przez jeden znak. Jeśli skala ma wartość 0, warto-ści ��(��� i ����( nie zawierają kropki dziesiętnej lub części ułamkowej.

Standard SQL wymaga, by kolumna @04)A< mogła przechowywać wszystkie wartościskładające się z pięciu cyfr i dwóch miejsc po przecinku. Dlatego w tym przypadku zakreswartości, które mogą być przechowywane w tej kolumnie, to przedział od �!!!&!! do!!!&!!. Trzeba jednak pamiętać o dwóch sprawach:

� Na dodatniej granicy zakresu kolumna może w rzeczywistości przechowywaćliczby do !!!!&!!. Dla liczb dodatnich MySQL rozszerza górną granicęzakresu, ponieważ używa bajta zarezerwowanego dla znaku.

� W wersjach poprzedzających MySQL 3.23 kolumny typu ��(��� sąprzechowywane inaczej i nie mogą reprezentować wszystkich wartościwymaganych przez standard SQL. To dlatego, że dla typu ��(�����%�� wartość� obejmuje bajty dla znaku i kropki dziesiętnej. W ten sposób do zakresukolumny @04)A< przed MySQL 3.23 należałyby liczby od �!&!! do !!&!!.

W standardzie SQL składnia ��(������ jest równoważna składni ��(�����%��. Podob-nie składnia ��(��� jest odpowiednikiem ��(�����%��, jeśli dozwolone jest definio-wanie wartości �. Od MySQL 3.23.6 obsługiwane są obie formy typów danych ��(���i ����(. Wartość domyślna parametru � wynosi 10. W wersjach poprzedzających3.23.6 konieczne jest wyraźne określenie obu parametrów � i �.

Maksymalny zakres wartości ��(��� i ����( jest taki sam jak dla typu ������, jednakna rzeczywisty zakres tych kolumn może wpływać zadeklarowana dla danej kolumnydokładność lub skala. Jeśli kolumna takiego typu ma przypisaną wartość o liczbie miejscpo przecinku przekraczającej zezwalaną skalę, wartość zostaje przekształcona do tejskali (zależy to od systemu operacyjnego, ale zazwyczaj jest to przekształcenie do do-zwolonej liczby cyfr). Gdy kolumnie ��(��� lub ����( przypisana jest wartość, któraprzekracza zakres wskazany przez określoną w definicji (lub domyślną) dokładnośći skalę, MySQL przechowuje wartość reprezentującą koniec tego zakresu.

W przypadku typów dla kolumn z liczbami zmiennoprzecinkowymi MySQL przechowujewartości o pojedynczej precyzji przy użyciu czterech bajtów, a wartości o podwójnejprecyzji, wykorzystując osiem bajtów.

Typ ���� służy do reprezentowania przybliżonych liczbowych typów danych. StandardSQL pozwala na opcjonalne deklarowanie dokładności (ale nie zakresu wykładnika)w nawiasach w bitach po słowie kluczowym ����. Implementacja MySQL obsługujerównież tę opcjonalną specyfikację dokładności, ale jej wartość służy jedynie do okre-ślenia rozmiaru pamięci. Dokładność od 0 do 23 powoduje uzyskanie czterobajtowejkolumny ���� o pojedynczej precyzji. Dokładność od 24 do 53 daje w rezultacie ośmio-bajtową kolumnę ������ o podwójnej precyzji.

Page 18: MySQL. Opis języka

4.3. Typy związane z datą i czasem 135

Jeśli słowo kluczowe ���� zostaje użyte do zadeklarowania typu kolumny bez specy-fikacji dokładności, wówczas wartości przechowywane są przy wykorzystaniu czterechbajtów. MySQL obsługuje również odmianę tej składni, w której po słowie kluczowym���� znajdują się dwie umieszczone w nawiasach liczby. Pierwsza reprezentuje szero-kość wyświetlania, a druga liczbę przechowywanych i wyświetlanych cyfr po kropcedziesiętnej (podobnie jak w przypadku typów ��(��� i ����(). Kiedy zachodzi po-trzeba przechowania w takiej kolumnie liczby, której ilość cyfr po kropce dziesiętnejprzekracza określony dla kolumny limit, to przechowywana wartość zostanie zaokrą-glona, aby usunąć dodatkowe cyfry.

W standardzie SQL typy ���� i �������'��(�� nie zezwalają na określanie dokład-ności. Przez MySQL obsługiwany jest wariant składni, w którym po nazwie typu możnapodać w nawiasie dwie liczby. Pierwsza reprezentuje maksymalną szerokość wyświe-tlania, a druga — liczbę przechowywanych i wyświetlanych cyfr po kropce dziesiętnej.Jako rozszerzenie standardu SQL, ������ rozpoznawane jest przez MySQL jako syno-nim typu ������ '��(�� . W odróżnieniu od nakładanego przez standard wymogu,by dokładność dla typu ���� była mniejsza od określonej dla �������'��(�� , obatypy implementowane są przez MySQL jako ośmiobajtowe wartości zmiennoprzecin-kowe o podwójnej precyzji (chyba że dla parametru )*+�-./0 serwera włączono opcję����,��,����).

Dla uzyskania maksymalnej przenośności, w kodzie, który wymaga przechowywaniaprzybliżonych wartości danych liczbowych, powinien być używany typ ���� lub ������'��(�� bez określania dokładności lub liczby miejsc po kropce dziesiętnej.

Jeśli w kolumnie typu liczbowego ma być przechowywana wartość spoza dopuszczalnegozakresu dla danego typu, wartość zostanie przycięta do odpowiedniej granicy zakresui dopiero w ten sposób uzyskana liczba będzie przechowana.

Kolumna � ma na przykład zakres od ��� � ��� � do �� � ��� �. Gdyby spróbowaćwstawić do niej liczbę �!!!!!!!!!!, wartość ta zostałaby przycięta do dolnego krańcazakresu i w zamian zachowana liczba ��� � ��� �. Podobnie, gdyby spróbować wstawićliczbę !!!!!!!!!!, wartość ta zostałaby przycięta do górnego krańca zakresu i w zamianzachowana liczba �� � ��� �.

Jeśli kolumna � ma atrybut � �� ��, wielkość zakresu kolumny pozostaje bez zmian,ale jego krańce przesuwają się, tworząc przedział od � do �! !���!�. Gdyby spró-bować przechować liczby �!!!!!!!!!! i !!!!!!!!!!, w kolumnach zostałyby zapisanewartości � i �! !���!�.

Konwersje, spowodowane odcinaniem, są dla instrukcji �����������, ���������� ��,�'���� i wielowierszowych ���� poprzedzane ostrzeżeniami.

4.3. Typy związane z datą i czasem

Typami, które służą do reprezentowania wartości związanych z datą i czasem, są ��������, ����, �������', ��� i ����. Wszystkie mają zakres dopuszczalnych wartościoraz wartość zerową, wykorzystywaną w razie podania wartości niedozwolonej, której

Page 19: MySQL. Opis języka

136 Rozdział 4. ♦ Typy kolumn

MySQL nie może reprezentować. Typ �������' posiada także opisaną w dalszej częścirozdziału specjalną możliwość automatycznej aktualizacji.

MySQL pozwala przechowywać pewne „niekoniecznie poprawne” wartości dat, takiejak 2�!!!������2. To dlatego, że sprawdzanie daty należy do czynności wykonywanychprzez aplikację, a nie serwer MySQL. Aby przyspieszyć sprawdzanie dat, przez MySQLweryfikowane jest tylko, czy podany miesiąc należy do przedziału od 0 do 12, a dzieńdo przedziału od 0 do 31. Zakresy te zawierają zero, ponieważ MySQL pozwala naprzechowywanie w kolumnie ���� i ������� danych, w których dzień lub miesiąc jestzerem. Jest to szczególnie praktyczne dla aplikacji, za pomocą których zapisywana jestdata urodzin, chociaż data taka nie jest dokładnie znana. W takim przypadku wystarczyzapisać datę w postaci 2�!!!������2 lub 2�!!!������2. Przechowując datę zapisanąw ten sposób, nie należy oczekiwać uzyskania poprawnych wyników z takimi funkcja-mi, jak ����,����� lub ����,���, które wymagają podania pełnych dat.

Oto ogólne warunki, o których warto pamiętać, pracując z typami daty i czasu:

� Wartości dla danego typu daty lub czasu pobierane są przez MySQLw standardowym formacie wyjściowym, ale podejmowana jest próbainterpretacji różnych formatów dla wartości wejściowych, dostarczanychprzez użytkownika (na przykład gdy użytkownik poda wartość do przypisaniado typu związanego z datą lub godziną lub do porównania z nim). Obsługiwanesą tylko formaty opisane w poniższych podrozdziałach. Oczekuje sięod użytkownika dostarczania poprawnych wartości. Użycie wartości w innychformatach może spowodować pojawienie się nieoczekiwanych wyników.

� Daty zawierające dwucyfrowe wartości dla roku są niejednoznaczne, ponieważnie jest znany wiek. Takie dwucyfrowe wartości interpretowane są przezMySQL za pomocą następujących zasad:

� Wartości roku w zakresie od ����! są przekształcane na lata ��������!.

� Wartości roku w zakresie ���!! są przekształcane na lata �!����!!!.

� Choć wartości mogą być interpretowane przez MySQL w wielu formatach,daty muszą być zawsze podawane w kolejności rok-miesiąc-dzień(na przykład 2!���!�� 2), a nie w powszechnie używanej postacimiesiąc-dzień-rok lub dzień-miesiąc-rok (na przykład 2�!�� �!�2, 2� ��!�!�2).

� MySQL powoduje automatyczne przekształcenie wartości typu daty lub czasuna liczbę, jeśli są one używane w kontekście liczbowym i na odwrót.

� Kiedy MySQL napotka wartość dla typu związanego z datą lub czasem, którawychodzi poza zakres lub jest w inny sposób niedopuszczalna (w sposóbopisany na początku tego punktu), przekształca tę wartość na wartość „zero”danego typu. Wyjątkiem są wychodzące poza zakres wartości ���, które sąprzycinane do odpowiedniej wartości stanowiącej granicę zakresu tego typu.

Poniższe zestawienie przedstawia formaty wartości „zerowej” dla każdego typu:

Page 20: MySQL. Opis języka

4.3. Typy związane z datą i czasem 137

Typ kolumny Wartość „zerowa”

&�����#� 0����!��!�����1��1��0

&��� 0����!��!��0

��#����#2 ��������������

��#� 0��1��1��0

��� ����

� Wartości „zerowe” są specjalne, ale można je przechowywać lub odwoływaćsię do nich w sposób jawny, używając wartości przedstawionych w tabeli.Można również wykonywać to, korzystając z wartości 2�2 lub �, co jestw sumie łatwiejsze do zapisania.

� Zerowe wartości daty lub czasu, stosowane w interfejsie Connector/ODBC,zostają automatycznie przekształcone do wartości ��� w interfejsie Connector/ODBC 2.50.12, ponieważ ODBC nie potrafi obsługiwać takich wartości.

4.3.1. Typy DATETIME, DATE i TIMESTAMP

Typy �������, ���� i �������' są ze sobą związane. W tym punkcie opisana zostanieich charakterystyka, a także omówione będą podobieństwa i różnice między nimi.

Typ ������� stosuje się, gdy potrzebne są wartości składające się z informacji o daciei czasie. Wartości ������� pobierane są i wyświetlane przez MySQL w formacie 2�������������3��3��2. Obsługiwany zakres obejmuje wartości od 2�������������3��3��2do 2!!!!���������3�!3�!2 („obsługiwany” oznacza, że choć wartości dla dat wcześniej-szych mogą być prawidłowo zinterpretowane, nie ma gwarancji, że tak będzie).

Typ ���� stosuje się, gdy potrzebna jest tylko wartość daty bez części podającej godzinę.Wartości ���� wyświetlane są przez MySQL w formacie 2����������2. Obsługiwanyzakres obejmuje daty od 2����������2 do 2!!!!������2.

Właściwości typu kolumny �������' różnią się w zależności od wersji MySQL i trybuSQL, w którym działa serwer. Zostały one podane w dalszej części tego punktu.

Wartości �������, ���� i �������' można deklarować za pomocą dowolnego z popu-larnych zestawów formatów:

� Jako łańcuch w formacie 2�������������3��3��2�lub 2�����������3��3��2.Dozwolona jest nieco mniej rygorystyczna składnia: znakiem rozdzielającymelementy daty i czasu może być dowolny znak interpunkcyjny. Równoważnebędą na przykład zapisy 2!����������3��3 �2, 2!�&��&�����#��# �2,2!�B��B�����$��$ �2�i 2!�C��C�����D��D �2.

� Jako łańcuch w formacie 2����������2�lub 2��������2. I tu dozwolona jestmniej rygorystyczna składnia, na przykład 2!�������2, 2!�&��&��2, 2!�B��B��2i 2!�C��C��2.

Page 21: MySQL. Opis języka

138 Rozdział 4. ♦ Typy kolumn

� Jako łańcuch bez znaków rozdzielających elementy daty w formacie2��������������2�lub 2������������2, jeśli tylko dany ciąg odzwierciedlarozsądną datę. Zapisy 2�!!������!����2 i 2!������!����2 interpretowane sąna przykład jako 2�!!���������!3��3��2, ale 2!�������!���2 jest wartościąniedozwoloną (dziwna liczba w elemencie reprezentującym minuty) i zostanieprzekształcona do wartości 2�������������3��3��2.

� Jako łańcuch bez znaków rozdzielających elementy daty w formacie2��������2�lub 2������2, jeśli tylko dany ciąg odzwierciedla rozsądną datę.Na przykład 2�!!�����2 i 2!�����2�są interpretowane jako 2�!!�������2,ale 2!�����2 jest wartością niedozwoloną (dziwny numer miesiąca i dnia)i zostanie przekształcona do wartości 2����������2.

� Jako liczba w formacie ���������������lub ������������, jeśli tylko danyciąg odzwierciedla rozsądną datę. Na przykład �!���!�������� i ���!��������są interpretowane jako 2�!����!������3��3��2.

� Jako liczba w formacie ���������lub ������, jeśli tylko dany ciągodzwierciedla rozsądną datę. Na przykład �!���!�� i ���!�� są interpretowanejako 2�!����!���2.

� Jako wynik funkcji, która zwraca wartość akceptowaną przez typy �������,���� i �������', na przykład �E�� lub (���� �,����.

Niedozwolone wartości �������, ���� i �������' są przekształcane na wartości zeroweodpowiedniego typu (2�������������3��3��2, 2����������2 lub ��������������).

W przypadku wartości określonych jako łańcuchy, które zawierają znaki rozdzielają-ce poszczególne części daty, nie ma konieczności podawania dwóch cyfr dla wartościmiesiąca i dnia nie przekraczających 10. 2�!�!���!2 jest tym samym, czym jest 2�!�!�����!2. Podobnie dla wartości określanych jako łańcuchy ze znakami rozdzielającymiczęści godziny, nie ma konieczności podawania dwóch cyfr dla wartości godziny, minutyi sekundy mniejszych od 10. 2�!�!��������3�3�2 jest tym samym, czym jest 2�!�!���������3��3��2.

Wartości zadeklarowane jako liczby powinny mieć długość 6, 8, 12 i 14 cyfr. Jeśli liczbaskłada się z 8 lub 14 cyfr, zakłada się, że jest w formacie �������� i ��������������oraz że rok jest reprezentowany przez pierwsze cztery cyfry. Jeśli liczba składa się z 6lub 12 cyfr, zakłada się, że jest w formacie ������ i ������������ i że rok reprezentująpierwsze dwie cyfry. Liczby składające się z innej liczby cyfr interpretuje się, jakbyzostały uzupełnione początkowymi zerami do najbliższej długości.

Wartości określone jako łańcuchy bez znaków rozdzielających części daty lub godzinysą interpretowane z wykorzystaniem ich długości w sposób następujący: jeśli łańcuchskłada się z 8 lub 14 znaków, zakłada się, że rok reprezentują pierwsze cztery cyfry.W przeciwnym razie zakłada się, ze rok został podany w postaci dwucyfrowej. Łańcuchjest interpretowany od lewej do prawej. Najpierw szukana jest wartość roku, miesiąca,dnia, godziny, minuty i sekundy dla jak największej liczby elementów obecnych w ciągu.To oznacza, że nie należy używać łańcuchów zawierających mniej niż 6 znaków. Poda-nie na przykład łańcucha 2!!��2, który w zamyśle miał reprezentować marzec 1999 roku,spowoduje, że do tabeli zostanie przez MySQL wstawiona wartość zerowa. Mimo że

Page 22: MySQL. Opis języka

4.3. Typy związane z datą i czasem 139

wartości roku i miesiąca są przechowywane w postaci liczb !! i ��, brakuje zupełnieczęści odnoszącej się do dnia, dlatego nie jest to poprawna wartość. Jednak począwszyod MySQL 3.23 użytkownik może brakujące części miesiąca i dnia zdefiniować w spo-sób jawny jako zero. Można na przykład użyć wartości 2!!����2, aby wstawić wartość2�!!!������2.

Istnieje pewna możliwość przypisywania wartości jednego typu danych do obiektuo innym typie. Może to jednak prowadzić do pewnych zmian w wartości lub do utratydanych:

� Jeśli obiektom ������� i �������' przypisze się wartość ����, część wartościwyjściowej, związana z czasem, wynosić będzie 2��3��3��2, ponieważwartość ���� nie zawiera żadnych informacji o czasie.

� Jeśli obiektowi ���� przypisze się wartość ������� lub �������', częśćwartości wyjściowej, dotycząca czasu, zostanie usunięta, ponieważ typ ����nie przechowuje żadnych informacji o czasie.

� Należy pamiętać, że choć wartości �������, ���� i �������' można określaćprzy użyciu tego samego zestawu formatów, nie wszystkie typy mają tensam zakres wartości. Na przykład wartości �������' nie mogą być datamiwcześniejszymi niż rok �!�� lub starszymi niż rok ����. To oznacza, że datataka jak 2�!��������2, choć dopuszczalna jako wartość ������� i ����,nie jest poprawną wartością �������' i zostanie przekształcona na 0w razie przypisania do takiego obiektu.

Podczas określania wartości daty należy zapoznać się z pewnymi pułapkami:

� Uproszczony format, dozwolony dla wartości deklarowanych jako łańcuchy,może być nieco mylący. Wartość 2��3��3��2 może na przykład z powoduużytego znaku oddzielającego poszczególne elementy 232 przypominaćgodzinę, jednak użyta w kontekście daty zostanie zinterpretowana jako rok2����������2. Wartość 2��3 �3��2 zostanie przekształcona na 2����������2,ponieważ 2 �2 nie jest poprawnie zapisanym miesiącem.

� Serwer MySQL wykonuje tylko podstawowe sprawdzanie poprawności daty:zakres dla roku, miesiąca i dnia to odpowiednio od 1000 do 9999, od 00 do 12i od 00 do 31. Każda data, zawierająca części wychodzące poza te zakresy,podlega przekształceniu na 2����������2. Należy jednak pamiętać, że to niezapobiegnie przechowywaniu takiej niepoprawnej daty, jak 2������ ���2.Poprawność daty należy sprawdzić w aplikacji.

� Daty, zawierające wartości roku w postaci dwucyfrowej, są niejednoznacznez powodu braku informacji o wieku. Interpretowane są przez MySQLw następujący sposób:

� Wartości reprezentujące rok w zakresie od ����! zostają przekształconena rok ��������!.

� Wartości reprezentujące rok w zakresie od ���!! zostają przekształconena rok �!����!!!.

Page 23: MySQL. Opis języka

140 Rozdział 4. ♦ Typy kolumn

4.3.1.1. Właściwości TIMESTAMP przed wersją 4.1 MySQL

Typ �������' można wykorzystać do automatycznego oznaczania bieżącą datą i czasemoperacji ���� i �'����. Jeśli tabela zawiera wiele kolumn �������', automatycznieaktualizowana jest tylko pierwsza.

Automatyczna aktualizacja pierwszej kolumny �������' w tabeli jest wykonywana,gdy spełniony jest dowolny z poniższych warunków:

� Kolumna zostaje jawnie zadeklarowana jako ���.

� Kolumna nie jest jawnie określona w instrukcji ���� lub ���������� ��.

� Kolumna nie jest jawnie określona w instrukcji �'����, a w jakiejś innejkolumnie zmieniana jest wartość. Jeżeli aktualizacja przypisze kolumniewartość, którą ta już zawiera, kolumna �������' nie będzie aktualizowana.Jeśli kolumnie zostanie przypisana jej bieżąca wartość, aktualizacja zostanieprzez MySQL zignorowana z powodów wydajnościowych.

Bieżącą datę i godzinę można przypisywać nie tylko pierwszej kolumnie �������'.Aby wpisać je do innych kolumn tego typu, wystarczy przypisać kolumnie wartość ��� lub �E��.

Dowolnej kolumnie �������' można jawnie przypisać wartość inną niż bieżąca datai czas. Dotyczy to nawet pierwszej kolumny �������'. Jest to przydatne, w sytuacjigdy na przykład chcemy przypisać �������' bieżącą datę i czasy w momencie tworze-nia rekordu, ale tak, by informacja ta nie była już później zmieniana:

� Należy podczas tworzenia rekordu zezwolić MySQL na przypisanie kolumniewartości. To spowoduje zainicjowanie jej z bieżącą datą i czasem.

� Po wykonaniu kolejnych aktualizacji innych kolumn w rekordzie, należyprzypisać kolumnie �������' w sposób jawny bieżącą wartość znacznika czasu:

'2&������������������������� ���� ��3����� ���� ����������������3�����������������������������3����������������444

Innym sposobem utworzenia kolumny, w której rejestrowany będzie czas utworzeniarekordu, jest przygotowanie kolumny �������, inicjalizowanej za pomocą funkcji �E��w momencie tworzenia wiersza, po czym, przy kolejnych aktualizacjach, pozostawia-nie jej bez zmian.

Zakres obejmowany przez wartości �������' rozpoczyna się od roku 1970 i sięga doroku 2037 z dokładnością co do jednej sekundy. Wartości wyświetlane są jako liczby.

Format, w którym przez MySQL pobierane są i wyświetlane wartości �������', zależyod maksymalnej wyświetlanej liczby cyfr — zostało to przedstawione w poniższymzestawieniu. Pełny format typu �������' liczy 14 cyfr, ale takie kolumny można takżetworzyć z mniejszym rozmiarem wyświetlania:

Page 24: MySQL. Opis języka

4.3. Typy związane z datą i czasem 141

Specyfikacja typu Format wyświetlania

��#����#2�(� ����##&&))##��

��#����#2��� ��##&&))##��

��#����#2��� ��##&&))##

��#����#2�� ����##&&

��#����#2%� ��##&&

��#����#2(� ��##

��#����#2�� ��

Rozmiar przechowywanych wartości wszystkich kolumn �������' jest ten sam bezwzględu na liczbę wyświetlanych cyfr. Najbardziej popularnymi rozmiarami wyświetlaniasą 6, 8, 12 i 14. Podczas tworzenia tabeli istnieje także możliwość określenia dowolnejmaksymalnej liczby wyświetlanych cyfr, ale w przypadku wartości 0 lub wartości prze-kraczającej 14 kolumna zostanie potraktowana jako �������'�� �. Nieparzyste warto-ści �� w zakresie od 1 do 13 traktowane są jako wyższa o jeden liczba parzysta.

Kolumny �������' przechowują poprawne wartości z zastosowaniem pełnej dokład-ności, z którą wartość została zadeklarowana, bez względu na rozmiar wyświetlania.Prowadzi to do kilku następstw:

� Należy zawsze deklarować rok, miesiąc i dzień, nawet gdy kolumna jest typu�������'� � lub �������'���. W przeciwnym razie wartość nie będziepoprawną datą i przechowane zostanie 0.

� Użycie instrukcji ����������� do poszerzenia zbyt wąskiej kolumny �������'spowoduje wyświetlenie poprzednio ukrytych informacji.

� Podobnie, zwężenie kolumny �������' nie spowoduje utraty informacji.Po prostu mniej informacji będzie wyświetlanych.

� Mimo że wartości �������' są przechowywane z pełną dokładnością, jedynąfunkcją, której działanie bezpośrednio dotyczy faktycznie przechowywanychwartości, jest � ",�������'��. Inne funkcje operują na sformatowanychwartościach odczytanych. Oznacza to, że takich funkcji, jak 1����� lub ��(� ���można używać tylko wtedy, gdy sformatowana wartość znacznika zawierastosowną część wartości �������'. Część �� kolumny �������' nie jest naprzykład wyświetlana, jeśli rozmiar wyświetlania nie przekracza 10. Z tegopowodu próba użycia funkcji 1����� na wartościach �������' o skróconymformacie wyświetlania zwraca niezrozumiały wynik.

4.3.1.2. Właściwości TIMESTAMP począwszy od wersji 4.1 MySQL

Od wersji 4.1.0 właściwości �������' różnią się od tych z wcześniejszych wersjiMySQL.

� Kolumny �������' są wyświetlane w tym samym formacie, w którymwyświetlane są kolumny �������.

� Szerokości wyświetlania nie są obsługiwane w sposób opisany w poprzednimpodpunkcie. Innymi słowy, nie można używać takich deklaracji, jak�������'��� czy �������'� �.

Page 25: MySQL. Opis języka

142 Rozdział 4. ♦ Typy kolumn

Dodatkowo, jeśli serwer MySQL pracuje w trybie ��"��, typ �������' jest identycz-ny z typem �������. Jeśli serwer działa w trybie ��"�� w momencie tworzenia tabeli,wszystkie kolumny �������' zostają utworzone jako kolumny �������. W rezultaciestosowany jest dla nich format wyświetlania �������, ten sam zakres wartości, a ichaktualizacja nie jest wykonywana automatycznie.

MySQL można uruchamiać w trybie ��"�� od wersji 4.1.1. Aby tego dokonać, należyuruchomić serwer SQL z opcją ��)*+�-./0F��"�� lub podczas pracy serwera zmody-fikować zmienną globalną )*+,-./0:

56.7�8������������� ����������

Aby serwer działał w trybie ��"�� dla połączenia danego klienta, wystarczy skorzystaćz instrukcji:

56.7�8��������������� ����������

4.3.2. Typ TIME

Wartości ��� pobierane są i wyświetlane przez MySQL w formacie 2��3��3��2 (lub2���3��3��2 dla godzin o większych wartościach). Wartości ��� należą do zakresu od2����3�!3�!2 do 2���3�!3�!2. Element reprezentujący godzinę może przybierać takduże wartości, ponieważ typ ��� może służyć nie tylko do reprezentowania godzinw ciągu doby (która nie może przekroczyć 24 godzin), ale również upływającego czasulub przedziału czasowego między dwoma zdarzeniami (a ten może znacznie przekro-czyć 24 godziny, a nawet być liczbą ujemną).

Wartości ��� można deklarować w wielu formatach:

� Jako łańcuch w formacie 2����3��3��&9G<-082. Można także użyć jednegoz nieco prostszych formatów: 2��3��3��&9G<-082, 2��3��3��2, 2��3��2, 2���3��3��2, 2����3��2, 2����2 lub 2��2. Parametr � reprezentuje dni i możeprzybierać wartość od 0 do 34. Należy zauważyć, że MySQL nie przechowujejeszcze części ułamkowej.

� Jako łańcuch bez znaków rozdzielających elementy godziny w formacie2������2 przy założeniu, że reprezentowana przez niego godzina istnieje.2������2�należy na przykład odczytać jako 2��3��3��2, natomiast 2��!���2jest wartością niepoprawną (część reprezentująca liczbę minut jestbezsensowna) i zostanie przekształcona na 2��3��3��2.

� Jako liczba w formacie ������ przy założeniu, że reprezentowana przez niegogodzina istnieje, na przykład �������należy odczytać jako 2��3��3��2.Zrozumiałe są także następujące formaty alternatywne: ��, ����, ������,������&9G<-08. Należy zauważyć, że MySQL nie przechowuje jeszczeczęści ułamkowej.

� Jako wynik funkcji, która zwraca wartość akceptowaną dla typu ��� — możenią być na przykład funkcja (���� �,���.

Page 26: MySQL. Opis języka

4.3. Typy związane z datą i czasem 143

W przypadku wartości ���, zadeklarowanych jako łańcuchy zawierające elementyrozdzielające części godziny, nie ma potrzeby podawania dwóch cyfr dla wartości go-dziny, minuty i sekundy, mniejszych niż 10. Wartość 2�3�3�2 jest tym samym, czymjest 2��3��3��2.

Należy uważać w przypadku przypisywania do kolumn ��� godzin o skróconej postaci.Podczas interpretacji wartości bez dwukropków zakłada się, że cyfry na jej prawymkońcu reprezentują sekundy (MySQL interpretuje wartości ��� jako upływający czas,a nie jako godzinę dnia). Można by sądzić na przykład, że 2����2 i ���� oznaczają godzi-nę 2��3��3��2�(12 minut po 11), ale MySQL zinterpretuje je jako 2��3��3��2 (11 minut,12 sekund). Podobnie 2��2 i �� są interpretowane jako wartość 2��3��3��2. Wartościz dwukropkami są zawsze traktowane jako godzina dnia, czyli 2��3��2 będzie oznaczać2��3��3��2, a nie 2��3��3��2.

Wartości, które są poza zakresem ���, ale oprócz tego są poprawne, zostają przyciętedo najbliższej granicy zakresu. Wartości 2����3��3��2 i 2���3��3��2 na przykład zosta-ną przekształcone na 2���3�!3�!2 i 2���3�!3�!2.

Niepoprawne wartości ��� zostają zapisane jako 2��3��3��2. Warto odnotować, żeponieważ wartość 2��3��3��2 jest sama w sobie poprawną wartością ���, patrząc nanią w tabeli, nie można ustalić, czy w ten sposób została zadeklarowana wartość ory-ginalna, czy też jest to wartość nieprawidłowa.

4.3.3. Typ YEAR

Typ ���� jest typem jednobajtowym, służącym do przechowywania wartości lat.

MySQL pobiera i wyświetla wartości ���� w formacie ����. Zakres wynosi od �!��do ����.

Wartości ���� można deklarować za pomocą różnych formatów:

� W postaci czterocyfrowego łańcucha w przedziale od 2�!��2�do 2����2.

� W postaci czterocyfrowej liczby w przedziale od �!���do ����.

� W postaci dwucyfrowego łańcucha w przedziale od 2��2�do 2!!2. Wartościz zakresu od 2��2 do 2�!2 i od 2��2 do 2!!2 są przekształcane na wartości���� należące do zakresów od ���� do ���! i od �!�� do �!!!. Należy jednakpamiętać, że zakres dla liczb dwucyfrowych różni się trochę od zakresudla dwucyfrowych łańcuchów, ponieważ nie można zadeklarować zerajako liczby, by zostało zinterpretowane jako ����. Wstawienie wartości ��do czterocyfrowej kolumny ���� spowoduje przechowanie jej pod postacią����, a nie na ����. Aby wartość została rozpoznana jako rok ����, należyprzesłać ją w postaci łańcucha 2�2 lub 2��2.

� W postaci wyniku funkcji, która zwraca wartość dopuszczalną dla typu ����,na przykład funkcja �E��.

Niepoprawne wartości ���� zostają przechowane pod postacią ����.

Page 27: MySQL. Opis języka

144 Rozdział 4. ♦ Typy kolumn

4.3.4. Problem roku 2000 a typy związane z datą

Sam MySQL jest całkowicie odporny na problem roku 2000 (patrz punkt 1.2.5), jednakwartości wejściowe, dostarczane serwerowi MySQL, takie być nie muszą. Wszystkiedaty z rokiem, wprowadzane w postaci dwucyfrowej, są niejednoznaczne, ponieważ niewiadomo, o które stulecie chodzi. Takie wartości muszą być przekształcone na formęczterocyfrową, ponieważ wewnętrznie lata przechowywane są przez MySQL w pełnej,czterocyfrowej postaci.

Dla typów �������, �������' i ���� daty interpretowane są niejednoznacznie, napodstawie następujących zasad:

� Wartości z zakresu ����! przekształcane są na wartości ��������!.

� Wartości z zakresu ���!! przekształcane są na wartości �!����!!!.

Należy pamiętać, że te reguły pozwalają jedynie domyślić się, co oznaczają wprowa-dzone przez użytkownika wartości. W przypadku uzyskania wartości, która nie jestpoprawna, należy podać rok w pełnej, czterocyfrowej postaci.

Za pomocą instrukcji �������� można poprawnie sortować wartości �������' i ����,w których rok jest podany w postaci dwucyfrowej.

Niektóre funkcje, takie jak � �� i ��"�� przekształcają wartości �������' lub ���� naliczby. To oznacza, że w przypadku wartości z rokiem, podanym w postaci dwucyfrowej,funkcje te dadzą błędny wynik. Aby tego uniknąć, należy przekształcić wartości ����lub �������' na format, w którym rok jest w postaci czterocyfrowej, lub skorzystaćw następujący sposób z funkcji ����,���: � �����,����:=-0):<-@%� ���7�����������.

4.4. Typy łańcuchowe

Do typów łańcuchowych zalicza się (1��, 7��(1��, ����, ��"�, � �� i ���. W tym pod-rozdziale przedstawione zostanie ich przeznaczenie, a także omówione będą metodywykorzystywania tych typów w zapytaniach.

4.4.1. Typy CHAR i VARCHAR

Typy (1�� i 7��(1�� są do siebie podobne. Różnią się tylko sposobem, w jaki są prze-chowywane i pobierane.

Długość kolumny (1�� jest stała i deklaruje się ją podczas tworzenia tabeli. Maksymalnadługość kolumny może być wartością z przedziału od 0 do 255 (w wersjach poprzedza-jących MySQL 3.23 długość (1�� mogła wynosić od 1 do 255). Wartości (1�� podczaszapisywania uzupełniane są z prawej strony odpowiednią liczbą spacji. Spacje te sąjednak odcinane w momencie pobierania ich przez klienta.

Page 28: MySQL. Opis języka

4.4. Typy łańcuchowe 145

Wartości w kolumnach 7��(1�� są łańcuchami o zmiennej długości. Można zadekla-rować kolumnę 7��(1�� o dowolnej długości z przedziału od 0 do 255, podobnie jakw przypadku kolumn (1�� (w wersjach poprzedzających MySQL 4.0.2 długość 7��(1��mogła wynosić od 1 do 255 znaków). W przeciwieństwie jednak do typu (1��, warto-ści 7��(1�� są przechowywane tylko w tylu bajtach, ile potrzeba ich do zapisania łań-cucha; dodatkowo jeden bajt przeznaczony jest do zanotowania długości. Wartości niesą dopełniane spacjami, natomiast znajdujące się na końcu spacje są usuwane, gdywartość jest zapisywana w tabeli. To odróżnia MySQL od specyfikacji typu 7��(1��w standardzie SQL.

Podczas zapisywania lub pobierania tych typów nie jest wykonywana także żadnakonwersja związana z wielkością liter.

Jeśli do kolumny (1�� lub 7��(1�� przypisze się wartość przekraczającą maksymalnądługość kolumny, wartość ta zostanie obcięta w celu jej dopasowania.

Jeśli użytkownik potrzebuje kolumny, dla której nie są usuwane końcowe spacje, powi-nien zastanowić się nad zastosowaniem typu ���� lub ��"�. Aby przechować wartościbinarne (takie jak wynik funkcji szyfrującej lub kompresującej), które mogą zawieraćprzypadkowe wartości bajtów, zamiast (1�� lub 7��(1�� należy użyć raczej kolumny����. To pozwoli uniknąć potencjalnych problemów z usuwaniem końcowych spacji,które mogłyby zmienić wartość danych.

W poniższym zestawieniu przedstawiono różnice między tymi dwoma typami kolumni pokazano rezultat zapisania różnych wartości łańcuchowych w kolumnach (1��� �i 7��(1��� �:

Wartość CHAR(4) Wymagana pamięć VARCHAR(4) Wymagana pamięć

00 0����0 (���/6 00 ����/

0��0 0����0 (���/6 0��0 $���/6

0��9:0 0��9:0 (���/6 0��9:0 +���/;<

0��9:-�=>0 0��9:0 (���/6 0��9:0 +���/;<

Wartości pobrane z kolumn (1��� � i 7��(1��� � będą w obu przypadkach takie same,ponieważ z kolumn (1�� w momencie pobierania wartości z tabeli usuwane są końco-we spacje.

Począwszy od MySQL 4.1 wartości w kolumnach (1�� i 7��(1�� są sortowane i po-równywane według porządku sortowania zestawu znaków przypisanego do kolumny.W wersjach wcześniejszych sortowanie i porównania były wykonywane na podstawieporządku sortowania zestawu znaków serwera. Użytkownik może deklarować kolumnęz atrybutem � ���, aby podczas sortowania i porównywania brana była pod uwagę wiel-kość liter, ponieważ użyte zostaną wartości liczbowe kodu, a nie porządek leksykalny.Atrybut � ��� nie wpływa na sposób, w jaki kolumna jest przechowywana i pobierana.

Od MySQL 4.1.0 typ (1������� jest aliasem typu (1���� ���. Jest to spowodowanewymogami kompatybilności.

Page 29: MySQL. Opis języka

146 Rozdział 4. ♦ Typy kolumn

Atrybut � ��� jest trwały. Oznacza to, że jeśli kolumna z atrybutem � ��� zostanieużyta w wyrażeniu, całe wyrażenie będzie traktowane jako wartość � ���.

Od wersji 4.1.0 można określać dla typu (1�� atrybut ��(. Przypisuje on zestaw znaku+<:=4�.

Od wersji 4.1.0 można określać dla typu (1�� atrybut � (���. Przypisuje on zestawznaku 9>)�.

Podczas tworzenia tabeli typ kolumny (1�� lub 7��(1�� może zostać zmieniony bezinformowania o tym użytkownika (patrz podpunkt 6.2.5.2).

4.4.2. Typy BLOB i TEXT

���� jest skrótem angielskiej nazwy binary large object (wielki obiekt binarny). Czterytypy ����: � �����, ����, ��������� i �� ����� różnią się tylko maksymalną długo-ścią wartości, które mogą przechowywać (patrz podrozdział 4.5).

Cztery typy ��"�: � ���"�, ��"�, �������"� i �� ���"� odpowiadają czterem typom���� i mają te same maksymalne długości i wymagania co do pamięci.

Kolumny typu ���� są traktowane jako łańcuchy binarne. Kolumny ��"� są traktowanezgodnie z ich zestawem znaków. Podczas sortowania i porównywania wartości ����nie jest brana pod uwagę wielkość liter. Od wersji 4.1 MySQL operacje sortowaniai porównywania wartości w kolumnach typu ��"� są wykonywane według porządkusortowania zestawu znaków przypisanego do kolumny. Wcześniej sortowanie i porów-nywanie tych kolumn było wykonywane na podstawie porządku sortowania zestawuznaków serwera.

Podczas zapisu i pobierania nie jest wykonywana żadna konwersja związana z wielkościąliter.

Jeśli do kolumny ���� lub ��"� zostanie przypisana wartość, która przekroczy maksymal-ną długość tego typu kolumny, wartość zostanie przycięta.

W pewnym sensie kolumnę ��"� można traktować jako kolumnę 7��(1�� o dowolnejwielkości. Podobnie kolumnę ���� można traktować jako kolumnę 7��(1���� ���.Typy ���� i ��"� różnią się od typów (1�� i 7��(1�� następującymi cechami:

� Kolumny ���� i ��"� mogą mieć indeksy dopiero od wersji 3.23.2 MySQL.Starsze wersje programu nie obsługiwały indeksowania tych typów kolumn.

� Dla indeksów na kolumnach ���� i ��"� należy określić długość przedrostkaindeksu. Dla typów (1�� i 7��(1�� jest to opcjonalne.

� Dla kolumn ���� i ��"� nie ma usuwania końcowych spacji podczaszapisywania lub pobierania wartości. To odróżnia je od kolumn (1��(spacje końcowe są usuwane w momencie pobierania wartości) i od kolumn7��(1�� (spacje końcowe są usuwane w momencie zapisywania wartości).

� Kolumny typu ���� i ��"� nie mogą mieć wartości ������.

Page 30: MySQL. Opis języka

4.4. Typy łańcuchowe 147

Od MySQL 4.1.0 typ �� � i �� ��7��(1�� odpowiada typowi danych �������"�. Jestto mechanizm dodany dla kompatybilności.

Interfejs Connector/ODBC deklaruje wartości ���� jako �� �7��� ���, a wartości ��"�jako �� �7��(1��.

Ponieważ wartości ���� i ��"� mogą być niezwykle długie, podczas ich stosowaniamożna spotkać się z pewnymi ograniczeniami:

� Jeśli na kolumnie typu ���� lub ��"� ma być wykonana operacja ����'���lub ��������, wartość kolumny należy przekształcić na obiekt o stałej długości.Standardowo wykonuje się to za pomocą funkcji ������ �, na przykład:

56.7�8��������������������������������� �������!��������"#$���%&�'����!8����������������������(�%&�'�

W przeciwnym razie podczas sortowania użyte zostaną tylko pierwsze bajty-<H,).I:,+04J:K kolumny. Domyślna wartość zmiennej -<H,).I:,+04J:Kwynosi 1024 i można ją zmienić przy użyciu opcji ��-<H,).I:,+04J:Kpodczas uruchamiania serwera -?)*+/.

Istnieje możliwość wykonania operacji grupowania na wyrażeniu, które jestzwiązane z wartościami ���� lub ��"� — za pomocą aliasu lub przez określeniepołożenia kolumny:

56.7�8��������)��� �������!��� �������*�*##$���&���!8��������������������� +��(�&�56.7�8��������)��� �������!��� �������*�*##$���!8��������������������� +��(�"�

� Maksymalny rozmiar obiektu ���� lub ��"� określa jego typ, ale o tym,jaką największą wartość można w rzeczywistości przesłać międzyklientem a serwerem, decyduje ilość dostępnej pamięci i rozmiar buforówkomunikacyjnych. Rozmiar bufora wiadomości można zastąpić, zmieniającwartość zmiennej -<H,<++.50/,@<>80:, ale trzeba to zrobić dla serwerai programu klienckiego. Na przykład na zmianę wartości opcji -<H,<++.50/,@<>80: po stronie klienta pozwalają�-?)*+ i -?)*+/9-@.

Każda wartość ���� i ��"� jest wewnętrznie reprezentowana przez obiekty o oddzielnieprzydzielanej pamięci. To odróżnia je od wszystkich innych typów kolumn, dla którychpamięć jest przydzielana raz na całą kolumnę w momencie otwarcia tabeli.

4.4.3. Typ Enum

� �� to obiekt łańcuchowy z wartością wybieraną z listy dozwolonych wartości, któresą w sposób jawny wyliczone w deklaracji kolumny podczas tworzenia tabeli.

W pewnych warunkach wartość może być również pustym łańcuchem (22) lub wartością ���:

� Jeśli do kolumny � �� zostanie wstawiona niepoprawna wartość (czyli łańcuchnienależący do listy dopuszczalnych wartości), to zostanie zastąpiona pustym

Page 31: MySQL. Opis języka

148 Rozdział 4. ♦ Typy kolumn

łańcuchem reprezentującym błędną wartość. Można go odróżnić od zwykłegopustego łańcucha, ponieważ jego wartość liczbowa jest równa 0. Więcej o tymza chwilę.

� Jeśli w deklaracji kolumny � �� dopuszczone będzie użycie wartości ���,będzie ona wartością prawidłową i wtedy wartością domyślną jest ���.Jeśli kolumna � �� zostanie zadeklarowana jako ��� ���, jej wartościądomyślną będzie pierwszy element na liście dozwolonych wartości.

Każda wartość wyliczenia ma indeks:

� Wartości należące do listy dopuszczalnych elementów w deklaracji kolumnysą ponumerowane, rozpoczynając od 1.

� Wartość indeksu pustego łańcucha reprezentującego błąd wynosi 0. Oznacza to,że poniższa instrukcja ����(� pomoże odszukać wiersze, którym przypisanoniepoprawne wartości � ��:

56.7�8��������,�����������������-.���������� �#�

� Indeksem wartości ��� jest ���.

Kolumna zadeklarowana jako � ����2A0/042%�2/5<2%�2:IL?2� może na przykład zawie-rać dowolną z przedstawionych w zestawieniu wartości. Dodatkowo zaprezentowanazostała wartość indeksu każdej wartości:

Wartość Indeks

�'�� �'��

00 �

0/-:-�0 �

0:<�0 �

0?@60 $

Wyliczenie może zawierać maksymalnie 65 535 elementów.

Począwszy od wersji 3.23.51 MySQL wartości należące do � �� mają automatycznieusuwane spacje końcowe w momencie tworzenia tabeli.

Podczas przypisywania wartości do kolumny � �� nieistotna jest wielkość liter. Wartościpobrane później z takiej kolumny są jednak wyświetlane przy użyciu liter o wielkościużytej w definicji kolumny.

Jeśli wartość � �� zostanie pobrana w postaci liczbowej, zwrócony zostanie indekswartości kolumny. W następujący sposób można na przykład pobrać wartość liczbowąz kolumny � ��:

56.7�8�������������� /#�����������������

Jeśli do kolumny � �� zostanie wpisana liczba, będzie ona traktowana jako wartośćindeksu, a przechowywana wartość będzie elementem wyliczenia o tym indeksie (niezadziała to jednak z instrukcją ���������, ponieważ traktuje ona wszystkie dane wej-

Page 32: MySQL. Opis języka

4.4. Typy łańcuchowe 149

ściowe jako łańcuchy). Nie zaleca się deklarowania kolumn � �� z wartościami wyli-czenia, które wyglądem przypominają liczby, ponieważ może to łatwo doprowadzić dopomyłki. Poniższa kolumna zawiera na przykład elementy wyliczenia, których warto-ści łańcucha — 2�2, 2�2 i 2�2 — mają wartości liczbowe indeksu równe �, � i �:

��9@�6���'#0�0��0�0��0�0�

Sortowanie wartości � �� odbywa się na podstawie porządku, w którym elementywyliczenia zostały wymienione w deklaracji kolumny (innymi słowy wartości � �� sąsortowane według przypisanych im wartości indeksu), na przykład 2<2 zostanie usta-wione przed 2M2�dla � ���2<2%�2M2�, ale 2M2 stanie przed 2<2 dla � ����2M2%�2<2�.Pusty łańcuch zostaje ustawiony przed łańcuchem niepustym, wartości ��� zostanąumiejscowione przed wszystkimi innymi wartościami wyliczenia. Aby zapobiec nie-oczekiwanym wynikom, należy w deklaracji kolumny wymienić wartości wyliczenialisty � �� w porządku alfabetycznym. Można również zastosować ����'����(��������7��(1��� lub ����'����(� (�����, aby upewnić się, że kolumna zostanie uporząd-kowana alfabetycznie, a nie według liczb w indeksie.

Aby ustalić wszystkie możliwe wartości dla kolumny � ��, należy użyć instrukcji �1�E(���� �������������������N�������� i przetworzyć definicję � �� w drugiejkolumnie danych wyjściowych.

4.4.4. Typ SET

��� to obiekt łańcuchowy składający się z zera lub większej liczby wartości, z którychkażda musi być wybrana z listy dozwolonych wartości, wyliczonych w deklaracji kolum-ny podczas tworzenia tabeli. W przypadku wartości kolumny typu ���, składających sięz wielu elementów zestawu, elementy te są oddzielane przecinkami (%). Z tego powoduwartości elementów ��� nie mogą zawierać przecinków.

Kolumna zadeklarowana na przykład jako ����2A0/042%�2/5<2�� ��� ��� może miećjedną z następujących wartości:

000/-:-�00:<�00/-:-���:<�0

Typ SET może zawierać maksymalnie 64 różne elementy.

Od wersji 3.23.51 MySQL podczas tworzenia tabeli z elementów należących do zestawuwartości automatycznie usuwane są spacje końcowe.

W MySQL wartości ��� przechowywane są w postaci liczbowej, w której bit mniej zna-czący przechowywanej wartości odpowiada pierwszemu elementowi zestawu. Wartość��� pobrana w postaci liczbowej ma ustawione bity odpowiadające elementom zestawu,które tworzą wartość kolumny. Można na przykład pobrać wartości liczbowe z kolum-ny ��� w następujący sposób:

56.7�8��������������/#�����������������

Page 33: MySQL. Opis języka

150 Rozdział 4. ♦ Typy kolumn

Jeśli liczba jest zapisana w kolumnie ���, bity włączone w binarnej reprezentacji liczbyokreślają elementy zestawu w wartości kolumny. Dla kolumny zadeklarowanej jako����2<2%�2M2%�2>2%�2/2� elementy mają następujące wartości dziesiętne i binarne:

Element SET Wartość dziesiętna Wartość binarna

0�0 � ����

0�0 � ����

090 ( ����

0:0 � ����

Jeśli do takiej kolumny przypisze się wartość 9, odpowiada to binarnej wartości 1001,czyli wybrane są pierwszy i czwarty element wartości ��� 2<2 i 2/2, dlatego w wynikuotrzymamy wartość 2<%/2.

W przypadku wartości zawierającej więcej niż jeden element ���, nie ma znaczeniakolejność, w jakiej elementy są wymienione podczas wstawiania wartości. Nie ma rów-nież znaczenia, ile razy dany element jest wymieniony w wartości. Kiedy później war-tość jest pobierana, każdy element w wartości będzie pojawiać się raz z elementamiwymienionymi zgodnie z porządkiem, w którym zostały podane podczas tworzeniatabeli. Jeśli kolumna została zadeklarowana jako ����2<%2M2%2>2%2/2�, wtedy warto-ści 2<%/2, 2/%<2 i 2/%<%<%/%/2 pojawią się w momencie pobrania jako 2<%/2.

Jeśli do kolumny ��� zostanie przypisana wartość nieobsługiwana., zostanie ona zigno-rowana.

Wartości ��� są sortowane według porządku liczbowego. Wartości ��� są ustawianeprzed niezerowymi wartościami ���.

Zazwyczaj element zestawu wyszukuje się za pomocą funkcji �, ,����� lub operato-ra �N�:

56.7�8��������,�����������������-.�������� �� ���!����������������$0#�56.7�8��������,�����������������-.�������������1��23�������32�

Pierwsza instrukcja znajduje wiersze, w których kolumna ����� zawiera element ze-stawu �� ���. Druga jest podobna, ale nie taka sama: odszukuje wiersze, w którychkolumna ����� zawiera wartość w dowolnym miejscu, nawet jako podłańcuch innegoelementu zestawu.

Poniższe instrukcje są również prawidłowe:

56.7�8��������,�����������������-.�����������4�*�56.7�8��������,�����������������-.�������������������������

Pierwsza z tych instrukcji powoduje wyszukanie wartości zawierających pierwszyelement zestawu, druga — wyszukanie elementu, który dokładnie pasuje do wzorca.Z porównaniami drugiego typu należy uważać. Porównywanie wartości zestawu do2�� �%�� �2 zwróci inny wynik niż porównanie wartości do 2�� �%�� �2. Wartościnależy podawać dokładnie w tej samej kolejności, w której są zadeklarowane w defi-nicji kolumny.

Page 34: MySQL. Opis języka

4.5. Rozmiar pamięci potrzebnej dla typów kolumn 151

Aby ustalić wszystkie możliwe wartości dla kolumny ���, należy użyć instrukcji �1�E(���� �������������������N������� i przetworzyć definicję ��� w drugiej kolumniewyniku.

4.5. Rozmiar pamięcipotrzebnej dla typów kolumn

Rozmiar pamięci dla każdego z typów kolumn, obsługiwanych przez MySQL, zostałwymieniony według kategorii.

Maksymalny rozmiar wiersza w tabeli �?��� wynosi 65 534 bajty. Każda kolumnatypu ���� lub ��"� stanowi tylko 5 do 9 bajtów tego rozmiaru.

Jeśli tabela �?��� lub ��� zawiera jakieś typy kolumn o zmiennej długości, takżei format rekordu będzie zmiennej długości. Podczas tworzenia tabeli, MySQL możespowodować w pewnych okolicznościach zmianę typu kolumny zmiennej długości nakolumnę stałej długości lub na odwrót (patrz podpunkt 6.2.5.2).

Rozmiar pamięci potrzebnej dla typów liczbowych

Typ kolumny Wymagany rozmiar pamięci

��� ��� 1 bajt

�#������ 2 bajty

#�&�'#��� 3 bajty

���, ����)�� 4 bajty

��)��� 8 bajtów

A������ 4 bajty — jeśli �B3���B3��(, 8 bajtów — jeśli �+�B3���B3�+$

A���� 4 bajty

&�'����C2��������D, ���� 8 bajtów

&���#������, �'#�������� �E� bajty — jeśli ��8��, �E� bajt — jeśli ��3�� (�E� — jeśli �B�)

Rozmiar pamięci potrzebnej dla typów związanych z datą i czasem

Typ kolumny Wymagany rozmiar pamięci

&��� 3 bajty

&�����#� 8 bajtów

��#����#2 4 bajty

��#� 3 bajty

��� 1 bajt

Page 35: MySQL. Opis języka

152 Rozdział 4. ♦ Typy kolumn

Rozmiar pamięci potrzebnej dla typów łańcuchowych

Typ kolumny Wymagany rozmiar pamięci

� ���� � bajtów, ��B3���B3��++

F��� ���� �E� bajtów, gdzie ��B3���i��B3���B3�++

��� ����, ��� ��G� �E� bajtów, gdzie ��B���

����, ��G� �E� bajty, gdzie ��B����

#�&�'#����, #�&�'#��G� �E$ bajty, gdzie ��B����

���)����, ���)��G� �E( bajty, gdzie ��B����

��'#����������������������444�

1 lub 2 bajty w zależności od liczby wartości wyliczenia

(maksymalnie 65 535)

�������������������������444�

1, 2, 3, 4 lub 8 bajtów w zależności od liczby elementów zestawu

(maksymalnie 64)

Typy 7��(1��, ���� i ��"� mają zmienną długość. Dla każdego ilość pamięci potrzeb-nej do przechowania wartości będzie zależeć od faktycznej długości wartości kolumny(reprezentowanej w ostatniej tabeli przez �), a nie od maksymalnego możliwego roz-miaru danego typu. Kolumna 7��(1������ na przykład może przechowywać łańcucho maksymalnej długości 10 znaków. Faktyczna ilość wymaganej pamięci to długośćłańcucha (�) plus 1 bajt do zapisania długości łańcucha. Dla łańcucha 2<M>/2 parametr� jest równy 4, a wymagany rozmiar pamięci to 5 bajtów.

Typy ���� i ��"� wymagają 1, 2, 3 lub 4 bajtów do zapisu długości wartości kolumnyw zależności od maksymalnej możliwej długości tego typu (patrz punkt 4.4.2).

Rozmiar obiektu � �� jest ustalany na podstawie liczby różnych wartości wyliczenia.Przy wyliczeniach do 255 możliwych wartości używany jest jeden bajt, a przy wyli-czeniach do 65 535 wartości używane są 2 bajty (patrz punkt 4.4.3).

Rozmiar obiektu ��� jest określany przez liczbę różnych elementów zestawu. Jeśli ze-staw ma rozmiar �, obiekt zajmuje ��#��B��bajtów, którą to wartość zaokrągla się do1, 2, 3, 4 lub 8 bajtów. Obiekt ��� może mieć do 64 elementów (patrz punkt 4.4.4).

4.6. Wybieranie odpowiedniego typudla kolumny

Aby jak najbardziej wydajnie korzystać z pamięci, należy we wszystkich przypadkachstarać się stosować typ, który będzie jak najbardziej dokładny. Jeśli na przykład w kolum-nie liczb całkowitych będą przechowywane wartości z zakresu od � do !!!!!, najlep-szym wyborem będzie typ ����� ��� �� ��. Ze wszystkich typów, które reprezentująwszystkie wymagane wartości, zajmuje najmniej pamięci.

Page 36: MySQL. Opis języka

4.7. Wykorzystywanie typów kolumn z innych mechanizmów baz danych 153

Powszechnym problemem jest dokładne przedstawianie wartości walutowych. W MySQLnależy do tego używać typu ��(���, za pomocą którego wartości zapisywane są w for-mie łańcucha. Dzięki temu nie traci się na dokładności (mimo to obliczenia z wartościami��(��� mogą być wciąż wykonywane przy użyciu operacji działających na liczbachz podwójną precyzją). Jeśli dokładność nie jest zbyt ważna, być może wystarczającodobrym typem będzie ������.

Aby uzyskać większą dokładność, można zawsze przekształcić wartość na typ stało-przecinkowy, przechowywany w �� �. Pozwoli to wykonywać wszystkie obliczeniana liczbach całkowitych i tylko w razie potrzeby przekształcać wynik z powrotem nawartości zmiennoprzecinkowe.

4.7. Wykorzystywanie typów kolumnz innych mechanizmów baz danych

Aby ułatwić użytkownikowi zastosowanie kodu pochodzącego od innych producentów,możliwe jest odwzorowanie typów kolumn w sposób przedstawiony w poniższej tabeli.Odwzorowania te upraszczają operację importu do MySQL definicji tabel z innychmechanizmów baz danych:

Typ innych producentów Typ MySQL

����� �� � ����������

� ���F�� ��)�� F��� ����

A����( A����

A����� &�'���

���� ��� ���

���� �#������

���$ #�&�'#���

���( ���

���� ��)���

���)�F������� #�&�'#����

���)�F��� �� #�&�'#��G�

���) #�&�'#��G��H:�#6�I��(4�4��

#�&&����� #�&�'#���

F������� �� � ����������

Odwzorowanie typów kolumn jest wykonywane podczas tworzenia tabeli, po czymoryginalne deklaracje typu zostają usunięte. Jeśli użytkownik utworzy tabelę z typamistosowanymi przez innych producentów, po czym wyda polecenie ���(���������������, zostanie przedstawiona struktura tabeli z odpowiadającymi im typami MySQL.