majkeloss 19 Września 2018 19 Września 2018 Poradnik dotyczący MySQL pod LUA i Pawn Spis treści: 1). Wprowadzenie 2). Wymagania 3). Transakcje: - omówienie - polecenia 3). Tworzenie tabel 4). Typy pól 5). Łączenie z bazą 6). Wysyłanie zapytania 7). Omówienie kilku funkcji dot. MySQL Wprowadzenie: MySQL to inaczej wolnodostępny system zarządzania bazą danych. Jest obsługiwany przez wiele systemów, dzięki czemu nie mamy problemu z utrzymaniem kompatybilności. Dodatkowo jest wydany wersji źródłowej, co umożliwia skompilowanie go dla dowolnej platformy systemowej. Istnieje kilka typów mechanizmów każdy z nich służy do innego zastosowania: - MyISAM - domyślny mechanizm (nie obsługuje transakcji ani kluczy obcych, umożlwia wyszukiwanie pełnotekstowe) - InnoDB - także domyślna opcja (obsługuje transakcje, klucze obce oraz zakładanie blokad na poziomie wierszy) Jest jeszcze kilka typów, ale nimi się nie będziemy interesować, ponieważ zostały wycofane. Wymagania(informacje dla osób chcących założyć hosting baz mysql): Co prawda MySQL nie potrzebuje dużych wymagań z takiego powodu iż sam w trakcie wykonywania procesów, stara się je sam optymalizować. To także dotyczy się tabel oraz baz danych. Z doświadczenia nauczyłem się, że w teorii bazy potrzebują dużo pamięci RAM i szybkie dyski, można też trafić na to, że procesory też są brane pod uwagę. Głównie MySQL opiera się na cache'ch, bo ponad 90% wykonywanych zapytań trafia właśnie tam. Konfiguracja dla osób, które chcą w przyszłości otworzyć firmę oferująca bazy danych: - Procesor: sempron 3000+ - Pamięć: 2 GM RAM - Dysk twardy (główny): 2x250 GB (RE, 16 MB cache) z RAID - Dysk twardy (poboczny): 1x400 GB (wolniejsze dyski, dla przeprowadzanych backup'ów) Druga konfiguracja "optymalna" dla użytkownika: - Procesor: 1000+ - Pamięć: 256/512 MB RAM - Dysk twardy: 20 GB z (RE, 16 MB cache i RAID) Transakcje: Transakcja - co to w ogóle jest? Otóż jest to zbiór operacji na bazie danych, które stanowią w istocie pewną całość i jako takie powinny być wykonane wszystkie lub żadna z nich. Przykładem takiej transakcji jest bankowa - przelew. Muszą zostać spełnione 2 operacje - zabranie pieniędzy z jednego konta oraz dopisanie ich do drugiego. W przypadku niepowodzenia żadna z tych operacji nie powinna być zatwierdzona, gdyż zajście tylko jednej powodowałoby nieprawidłowości w bazie danych (pojawienie się lub zniknięcie pieniędzy). Transakcja składa się z trzech elementów: rozpoczęcia wykonania zamknięcia W systemach bazodanowych istotne jest, aby transakcja trwała jak najkrócej, ponieważ równolegle może być dokonywanych wiele transakcji. Każdy etap transakcji jest logowany, dzięki czemu w razie awarii systemu można odtworzyć stan bazy danych sprzed transakcji, która nie została zamknięta. Transakcje w SQL W systemach baz danych realizujących standard SQL następujące polecenia dotyczą transakcji: BEGIN lub BEGIN WORK - rozpoczęcie transakcji; COMMIT - zatwierdzenie zmian wykonanych w obrębie transakcji; ROLLBACK - odrzucenie zmian wykonanych w obrębie transakcji; SAVEPOINT nazwa - zdefiniowanie punktu pośredniego o określonej nazwie; RELEASE SAVEPOINT nazwa - skasowanie punktu pośredniego; ROLLBACK TO SAVEPOINT nazwa - wycofanie transakcji do stanu zapamiętanego; Tworzenie tabel: Jest to główny proces obsługi naszej bazy, wymaga utworzenia bazy i połączenia się, ale o łączeniu w następnym rozdziale. Możemy zacząć wprowadzać dane, najpierw jednak trzeba utworzyć tabele, robimy to według następującego schematu: CREATE TABLE nazwa_tabeli (nazwa_pola1 typ_pola1 [atrybuty], nazwa_pola2 typ_pola2 [atrybuty], nazwa_pola3 typ_pola3 [atrybuty], PRIMARY KEY(nazwa_polaX)) Przykład: CREATE TABLE NBA (id int NOT NULL AUTO_INCREMENT, imie char(30), lata char(3), punkty char(3), mistrzostwa char(3), PRIMARY KEY(id)) Każda tabela musi posiadać co najmniej jedno pole, dodatkowo co najmniej jedno pole, które będzie jednoznacznie identyfikuje wiersz w tabeli - tak zwany klucz główny. Jeśli jest masa danych, a Ty znasz klucz główny jednego z wierszy wtedy możesz bez problemu dostać się do tego wiersza. W naszym przypadku kluczem głównym jest pole pierwsze - id. Przeważnie nadaje jako klucz główny określa się pierwsze pole tabeli. Dodatkowo klucz główny posiada dwa atrybuty: pierwszy - NOT NULL - oznaczający, że wartość tego pola nigdy nie może być pusta; drugi - AUTO_INCREMENT* - oznaczający, że wartość pola będzie automatycznie zwiększania przez bazę danych przy dodaniu rekordu;* Atrybut AUTO_INCREMENT - możemy stosować tylko do pól typu całkowitoliczbowego. Typy pól: Dostępnych jest wiele typów pól, najpopularniejsze poniżej: - CHAR(x) / VARCHAR(x) - ciąg znaków o maksymalnej dł. X, gdzie X nie może być większy od 255; - BLOB - binarny ciąg znaków o dł. ograniczonej przez pamięc Twojego serwera; - TINYINT(ilość znaków) - liczby z zakresu od -128 do 127 lub liczby dodatnie od 0 do 255; - SMALLINT(ilość znaków) - liczby z zakresu od -32768 do 32767 lub liczby dodatnie od 0 do 65535; - MEDIUMINT(ilość znaków) - liczby z zakresu od -8388608 do 8388607 lub liczby dodatnie od 0 do 16777215; - INTEGER / INT - liczba całkowita z przedziału -2147483647 do 2147483647 lub liczby dodatnie od 0 do 4294967295; - TEXT - tekstowy ciąg znaków o dł. ograniczonej przez pamięć Twojego serwera; - DATE - data w formacie określonym przez ustawienia serwera; - ENUM - enumeracja (wyliczenie). W kolumnie może się znaleźć jedna z podanych wartości; - YEAR - rok, jeśli zostanie podany zły, jego wartość zmieni się w 0000; - DECIMAL(x, y) - liczba dziesiętna, gdzie X oznacza maksymalną liczbe cyfr, a Y maksymalną liczbę cyfr po przecinku; Łączenie z bazą: Za pomocą poniższego kodu połączymy się poprawnie z naszą bazą (plugin: MySQL StrickenKid): #define SQL_HOST "localhost" #define SQL_USER "user" #define SQL_PASSWORD "password" #define SQL_DB "datebase" new MySQL:sql_init; public OnFilterScriptInit() { sql_init = mysql_init(1); new sql_handle = mysql_connect(SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DB, sql_init, .auto_reconnect=1); if (sql_handle) // mysql_connect jeśli nastąpi poprawne połączenie z bazą zwróci nam wynik "true" { // jeśli warunek się wykona printf("Połączono z bazą danych, gratulacje!"); } else { // jeśli warunek się nie wykona printf("Niepołączono z bazą danych!!!"); SendRconCommand("exit"); // zamykamy serwer } return 1; } public OnFilterScriptExit() return mysql_close(sql_init); I tak oto poprawnie połączyliśmy się z naszą bazą! Wysyłanie zapytania: W tym kroku nauczymy się wykonywać polecenia/zapytania, które wyślemy do naszej bazy. Dla przykładu pobierzemy z naszej przykładowej tabeli lata oraz punkty, którego wyszukamy za pomocą imienia. new buffer[127], playerNick[MAX_PLAYER_NAME]; GetPlayerName(playerid, playerNick, MAX_PLAYER_NAME); mysql_real_escape_string(playerNick, playerNick); // sprawdzamy, czy nie ma zadnych podejrzanych znakow, ktore moga naszej bazie zaszkodzic format(buffer, 127, "SELECT lata, punkty FROM NBA WHERE imie='%s'", playerNick); if (mysql_query(buffer)) mysql_ping(); // Ta linijka pozwoli nam podtrzymać nasze połączenie mysql_store_result(); // zapisujemy do pamięci if (mysql_num_rows() && mysql_fetch_row(buffer, "|")) { new lata, punkty; sscanf(buffer, "p<|>dd", lata, punkty); format(buffer, 127, "Masz %d punktów i %d lat.", punkty, lata); SendClientMessage(playerid, -1, buffer); } mysql_free_result(); // czyścimy pamięć Jeśli nasz rekord będzie istniał otrzymamy wiadomość np. Masz 14 punktów i 19 lat. Jak widzimy bardzo łatwo jest pobrać informacje posiadając jedno z nich - tutaj imię. Omówienie kilku funkcji dot. MySQL: Ogólnie w MySQL posiadamy bardzo dużo funkcji, które przydają się nam w różnych problemach można znaleźć rozwiązania dzięki nim. Podam tylko te związane z datą, które mogą posłużyć nam do stworzenia systemu Premium: ------------------------------------------------- | Funkcja | Przykład użycia | Opis | ------------------------------------------------- HOUR() | HOUR(kolumna) | Zwraca samą godzine, ze wskazanej daty MINUTE() | MINUTE(kolumna) | Zwraca same minuty, ze wskazanej daty. SECOND() | SECOND(kolumna) | Zwraca same sekundy, ze wskazanej daty. DAYNAME() | DAYNAME(kolumna) | Zwraca nazwę dnia tygodnia. DAYOFMONTH() | DAYOFMONTH(kolumna) | Zwraca sam dzień miesiąca, ze wskazanej daty (wyrażone liczbą). MONTHNAME() | MONTHNAME(kolumna) | Zwraca nazwę miesiąca występującego we wskazanej dacie. MONTH() | MONTH(kolumna) | Zwraca sam miesiąc ze wskazanej daty (wyrażony liczbą). YEAR() | YEAR(kolumna) | Zwraca sam rok ze wskazanej daty. ADDDATE() | ADDDATE(kolumna INTERVAL x typ) | Dodaje do daty przechowywanej w kolumnie x jednostek i zwraca wynik SUBDATE() | SUBDATE(kolumna INTERVAL x typ) | Odejmuje od daty przechowywanej w kolumnie x jednostek i zwraca wynik. UNIX_TIMESTAMP()| UNIX_TIMESTAMP(data) | Zwraca liczbę sekund jaka upłynęła od początku tzw. epoki unixa lub od wskazanej daty. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kontynuuj dyskusję
Dołącz do Pecetowicza, aby kontynuować dyskusję w tym wątku.