[[oktatas:adatbázis-kezelés:mysql|< MySQL]] ====== MySQL jegyzet ====== * **Szerző:** Sallai András * Copyright (c) 2012, Sallai András * Szerkesztve: 2012, 2014, 2015 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A MySQL-ről ===== Többfelhasználós, többszálú relációs adatbázis-kezelő szerver. A MySQL 1995-ben készítette a svéd MySQL AB. A MySQL adatbázis szerver a legnépszerűbb lett a webalkalmazások használatában. A MySQL AB kettős licenccel hozta forgalomba. Egy GNU GPL és egy zárt forráskódú változatban. Kezdetben csak Linuxra valósították meg. A MySQL-t az Oracle Corporation felvásárolta 2005 októberben. ===== Kapcsolódás a MySQL adatbázishoz ===== Telepítés után, kapunk egy parancssoros kliens programot, melynek neve mysql. Az adatbázis-kezelőben pedig alapértelmezetten három adatbázist látunk. Ezek rendre: * information_schema * mysql * performance_schema Ezekből valódi adatbázis a mysql, amely rendszer felhasználóit, az adatbázisokhoz és a felhasználókhoz tartozó jogokat tartalmazza. A másik két schem nevű adatbázis a rendszerről informál minket. A MySQL szerverhez kapunk egy parancssoros kliens programot is, amelynek a neve csak egyszerűen: mysql A mysql parancsot elindítva kapcsolódhatunk az adatbázisszerverhez, és ott SQL nyelven tetszőleges tevékenységet végezhetünk, a joginknak megfelelően. A következő mintában parancssorból kiadjuk a mysql utasítást: mysql -u root -p Paraméterként megadjuk a milyen felhasználóval szeretnénk elérni az adatbázisszervert. A "-p" kapcsoló azt jelenti, szeretnénk bekérni a jelszót. A parancsot kiadhatjuk szimpla felhasználóként, mivel a MySQL szerver nem értékeli a linuxos környezetet. ===== MySQL SQL ===== A MySQL 5.x verziók a ANSI SQL 99 szabványra épülnek, számos kiegészítéssel. A MySQL-ben minden SQL parancsot pontosvesszővel zárunk. A pontosvessző az úgynevezett delimiter, amely jelzi, hogy vége a parancsnak. Hasznos, ha több sorba szeretnénk írni az SQL utasítást. Az Enter hatására nem hajtódik végre az SQL utasítás, csak akkor, ha azt megelőzte egy ";" karakter is. A delimiter megváltoztatható a "delimiter" paranccsal. Legyen például "|": delimiter | A MySQL státuszából kiderül az aktuális delimiter: status ===== Felhasználó felvétele ===== A MySQL szerveren természetesen nem root felhasználóként szoktunk tevékenykedni, ezért első feladatunk egy felhasználó létrehozása. GRANT ALL PRIVILEGES ON databasenev.* TO 'valaki'@'localhost' IDENTIFIED BY 'titkosjelszo'; A parancs létrehozza a valaki nevű felhasználót ha az nem létezik, és jelszót is ad neki. A databasenev nevű adatbázis minden táblájához hozzáférhet a felhasználó. A végén a jogokat ki kell írni a memóriából: FLUSH PRIVILEGES; ===== Jelszóváltoztatás ===== ==== Általános jelszóváltás ==== Saját jelszó változtatása: set password = password('titok') ; Más jelszavának megváltoztatása: set password for 'jozsi'@'localhost' = password('titok') ; Persze lehet így is: UPDATE mysql.user SET Password=PASSWORD('titok') WHERE User='jozsi' AND Host='%.valahol.hu'; FLUSH PRIVILEGES; Esetleg jog adása közben: GRANT USAGE ON *.* TO 'jozsi'@'%.valahol.hu' IDENTIFIED BY 'titok'; ==== Root jelszó reset ==== === Első === invoke-rc.d mysql stop mysql_safe --skip-grant-tables & mysql -u root use mysql UPDATE user SET Password=PASSWORD(‘titok’) WHERE User=’root’; FLUSH PRIVILEGES; invoke-rc.d mysql start === Második === mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('titok'); === Harmadik === mysqladmin -u root password regijelszo "titok" Ha nincs beállítva a jelszó: mysqladmin -u root password "titok" === Negyedik === Debian GNU/Linuxon 5.1-es MySQL szerverrel: dpkg-reconfigure mysql-server-5.1 ===== MySQL típusok ===== ^ Egész típusok ^^^ ^ típus ^ méret ^ leírás ^ | TINYINT | 1 bájt | 8 bit \\ -128 .. 127 közötti szám \\ TINYINT UNSIGNED megadásával 0 .. 255 | | SMALLINT | 2 bájt | 16 bit \\ -32768 .. 32767 \\ előjel nélkül 0 .. 65535 | | MEDIUMINT | 3 bájt | 24 bit \\ -8 388 608 .. 8 388 607 | | INT vagy INTEGER | 4 bájt | 32 bit \\ -2 147 483 648 .. 2 147 483 647 | | BIGINT | 8 bájt | 64 bit \\ -9,22E+18 .. 9,22E18-1 \\ előjel nélkül: 0 .. 1,0E20 | ^ Lebegőpontos számok ^^^ ^ típus ^ méret ^ leírás ^ | FLOAT | 4 bájt | -3,402823466E+38 .. 1,175494351E-38 negatív számok \\ 1,175494351E-38 .. 3,402823466E+38 pozitív szám | | DOUBLE vagy REAL | 8 bájt | -1,7976931348623157E+308 .. -2,2250738585072014E-308 közötti negatív számok, \\ 0 és \\ 2,2250738585072014E-308 .. 1,7976931348623157E+308 közötti pozitív számok | ^ Fixpontos valós számok ^^^ ^ típus ^ méret ^ leírás ^ | DECIMAL, DEC vagy NUMERIC | pontosság + 2 bájt | megadható pontosság | ^ Karaktersorozatok ^^^ ^ típus ^ méret ^ leírás ^ | VARCHAR(méret) | 1 .. 255 bájt | | | CHAR(méret) | 1 .. 265 bájt | | | BINARY | | | | TINYTEXT | | | | TEXT | 0 .. 65 535 bájt | | | MEDIUMTEXT | | | | LONGTEXT | | | ^ Dátum ^^^ ^ típus ^ méret ^ leírás ^ | DATE | 3 bájt | ÉÉÉÉ-HH-NN formában tárolt dátum \\ 1000-01-01 .. 9999-12-31 közötti dátum | | TIME | 3 bájt | óó:pp:mm formájú idő \\ 00:00:00 .. 23:59:59 közötti időérték | | DATETIME | 8 bájt | ÉÉÉÉ-HH-NN óó:pp:mm formában dátum és idő \\ 1000-01-01 00:00:00 .. 9999-12-31 23:59:59 közötti érték | | YEAR | 1 bájt | 1970 .. 2069 közötti szám | | TIMESTAMP | 4 bájt | A rekord változásakor automatikusan aktualizálódik. \\ A tábla módosításainak nyomon követésére. | ^ Összetett típusok ^^^ ^ típus ^ méret ^ leírás ^ | enum(érték1, érték2, ...) | 1-255 elem 1 bájt \\ 256-65535 elem 2 bájt | A cellában csak az adott érték szerepelhet majd | | set(érték1, érték2, ...) | 1-8 elem 1 bájt \\ 9-16 elem 2 bájt \\ 17-24 elem 3 bájt \\ 25-32 elem 4 bájt \\ 33-64 elem 8 bájt | több érték is szerepelhet egy cellában | ^ Bináris típusok ^^^ ^ típus ^ méret ^ leírás ^ | TINYBLOB | 1 .. 255 bájt | kép, hang, bármilyen bináris adat vagy szöveg tárolására; méret tárolt adat + 1..4 bájt | | BLOB | 1 .. 65 535 bájt | | | MEDIUMBLOB | 1 .. 16 777 215 bájt | | | LONGBLOB | 1 .. 4 294 967 295 | | | BIT vagy BIT(...) | | 1..64 hosszú bináris adat \\ BIT == BIT(1) | ===== Tábla létrehozása ===== CREATE TABLE user ( User varchar(30) NOT NULL default , status enum('0','1') NOT NULL default '0', Password varchar(64) NOT NULL default , PRIMARY KEY (User) ) TYPE=MyISAM Kicsit összetettebb: CREATE TABLE `test`.`szemely` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `nev` VARCHAR( 30 ) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL DEFAULT '''Névtelen''', `fiz` INT( 4 ) NOT NULL ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_hungarian_ci; Tábla létrehozása meglévő tábla alapján. Az új táblánk felveszi a másik szerkezetét: create table újtábla like regitábla Tábla felépítése: describe Táblanév; Például a Személy tábla mezői: mysql> describe Személy; +--------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+----------------+ | Az | int(11) | NO | PRI | NULL | auto_increment | | Név | varchar(50) | NO | | NULL | | | Település | varchar(50) | NO | | NULL | | | Lakcím | varchar(50) | NO | | NULL | | | Születés | date | NO | | NULL | | | Fizetés | double | NO | | NULL | | | Juttatás | double | NO | | NULL | | | Saját kocsi | tinyint(4) | NO | | NULL | | +--------------+-------------+------+-----+---------+----------------+ 8 rows in set (0.03 sec) ===== Mentés, visszaállítás ===== Egy adatbázis mentése: mysqldump -u root -p adatbazisnev > adatbazisnev.sql Karakterkódolás: mysqldump database -u user --default-character-set=latin1 -r outfile.sql Karakterkódolás a következők lehetnek: * latin1 * latin2 * utf8 * stb. Visszaállítás: mysql -u root -p adatbazisnev < adatbazisnev.sql Az adatbázisnak léteznie kell. Egy tábla mentése: mysqldump -u root -p adatbazisnev --table tablanev > adatbazisnev.sql Csak az adatstuktúrák mentése: mysqldump -u username -p --no-data database_name > dump.sql Az összes adatbázis mentése: mysqldump -u username -p --all-databases > dump.sql Az information_schema kivételével minden adatbázist ment, beleértve a mysql is. ===== Information_schema ===== A MySQL 5 verziójától, amikor futtatjuk a show databases parancsot, az information_schema tartalmazza az adatbázisok listáját. Az information_schema egy virtuális adatbázis, amely miden adatbázisról tárolja a metainformációkat. Tipikusan amikor futtatod a DESCRIBE vagy a SHOW parancsot, metainformációkat kapsz. Az information_schema tábláin futtathatod az alapértelmezett SELECT SQL parancsot. Az információs séma nem egy fizikai adatbázis. Amikor futtatod a SELECT parancsot a information_schema tábláin, akkor valójában a többi tábla adatait és a rendszerváltozókat kérdezed le. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | bugs | | mysql | | sugarcrm | +--------------------+ 4 rows in set (0.00 sec) A következő táblák férhetőek hozzá az information_schema-ban: mysql> use information_schema; mysql> show tables; +---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLUMNS | | COLUMN_PRIVILEGES | | KEY_COLUMN_USAGE | | PROFILING | | ROUTINES | | SCHEMATA | | SCHEMA_PRIVILEGES | | STATISTICS | | TABLES | | TABLE_CONSTRAINTS | | TABLE_PRIVILEGES | | TRIGGERS | | USER_PRIVILEGES | | VIEWS | +---------------------------------------+ 17 rows in set (0.00 sec) Az 5 legnagyobb tábla lekérdezése: mysql> SELECT concat(table_schema,'.',table_name) table_name, -> concat(round(data_length/(1024*1024),2),'M') data_length -> FROM information_schema.TABLES -> ORDER BY data_length DESC LIMIT 5; +--------------------+-------------+ | table_name | data_length | +--------------------+-------------+ | bugs.attach_data | 706.89M | | bugs.longdescs | 3.45M | | bugs.bugs_activity | 1.45M | | bugs.series_data | 0.75M | | bugs.attachments | 0.51M | +--------------------+-------------+ 5 rows in set (0.05 sec) Az 1000 sornál több sort tartalmazó táblák lekérdezése mysql> select concat(table_schema,'.',table_name) as table_name,table_rows -> from information_schema.tables where table_rows > 1000 -> order by table_rows desc; +----------------------------------+------------+ | table_name | table_rows | +----------------------------------+------------+ | bugs.series_data | 52778 | | bugs.bugs_activity | 26436 | | bugs.longdescs | 21473 | | bugs.email_setting | 5370 | | bugs.attachments | 4714 | | bugs.attach_data | 4651 | | bugs.cc | 4031 | | bugs.bugs | 2190 | | bugs.namedqueries_link_in_footer | 1228 | +----------------------------------+------------+ 9 rows in set (0.04 sec) ===== Saját függvény ===== mysql> delimiter | mysql> CREATE FUNCTION sajatfuggveny(szam1 int, szam2 int) -> returns int deterministic -> begin -> declare result int; -> SET result = szam1 * 2; -> SET result = result + szam2; -> RETURN result; -> end| Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> select sajatfuggveny(3,4); +--------------------+ | sajatfuggveny(3,4) | +--------------------+ | 10 | +--------------------+ 1 row in set (0.00 sec) mysql> Saját függvények listázása: show function status; A függvény megvalósításának megjelenítése: show create function sajatfuggveny; ===== Trigger ===== ==== A triggerekről ==== A triggerek speciális eljárások, amelyk az INSERT, UPDATE, DELETE, TRUNCATE függvények előtt vagy után hajtódnak végre. ==== Példa ==== Létrehozok egy két mezőből álló táblát: ^ proba ^^ | nev | username | Beállítok egy triggert, amely mindig felülírja a username mezőt user() függvény tartalmával. A gyakorlatban: use test; create table proba ( names varchar(10), users varchar(10)); create trigger userIns before insert on proba for each row set new.users=user(); Ez után, ha beszúrok egy sort, például: insert into proba values ("Tibi", "tibi"); Ellenőrizzük: select * from proba; Ha volt már egy Lajos név beszúrva, ehhez hasonlót láthatunk: +---------+-------------+ | names | users | +---------+-------------+ | Lajos | joska@local | | Tibi | joska@local | +---------+-------------+ 2 rows in set (0.00 sec) A fenti SQL parancsot a joska felhasználó adata ki. ===== Mentés, visszaállítás (Backup, Restore) ===== Visszaállítása: mysql database < backup.sql ===== Külső parancs futtatása ===== Parancssorban: mysql database < backup.sql MySQL parancssorban: source batch_file.sql ===== Munka dátummal ===== Hány évesek vagyunk Select from_days(datediff(now(), '1979-07-31')) ===== Külső adat importálása ===== LOAD DATA LOCAL INFILE '/importfile.csv' INTO TABLE test_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (mezo1, mezo2, mezo3); LOAD DATA LOCAL INFILE 'C:\\file.csv' ... mysql -u**** -p**** database --execute="LOAD DATA LOCAL INFILE 'C:\\import.csv' INTO TABLE table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1, field2, field3)" Debian GNU/Linux alatt rendelkezésre áll még: mysqlimport Szintaxis: mysqlimport [options] db_name textfile1 [textfile2 ...] ===== Rendezés IP cím alapján ===== SELECT ip FROM dhcp ORDER BY INET_ATON(ip); ===== Riport készítése ===== * http://sourceforge.net/projects/dmyreports/ ===== Adatbázis-motor ===== A MySQL alapértelmezett adatbázismotorja a MyISAM. Ez azonban nem támogatja a tranzakciókat és a külső kulcs hivatkozásokat. Ha ilyet szeretnénk, akkor használjuk InnoDB adatbázismotort. ^ Funkció ^ MyISAM ^ InnoDB ^ | tranzakció | nem | igen | | külső kulcs | nem | igen | | táblazárolás | igen | igen | | rekord zárolás | nem | igen | | gyorsaság szélsőséges esetben \\ (egymáshoz képest) | jobb | kevésbé | | teljes szöveg | igen | nem | ===== MySQL SSL ===== A most következő leírás Debian GNU/Linux 6-os rendszeren mutatja be az SSL telepítését a MySQL adatbázishoz. mysql -u root -p show variables like '%ssl%'; Valami ehhez hasonlót kell lássunk: +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.00 sec) nano /etc/mysql/my.cnf # For generating SSL certificates I recomemend the OpenSSL GUI "tinyca" ssl # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem invoke-rc.d mysql restart Ezek után nézzük meg újra egy sql paranccsal a ssl tartalmú változókat: show variables like '%ssl%'; A kimenetben az ssl valami hasonló kell legyen: +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+-------+ 7 rows in set (0.00 sec) Hogy távolról is elérhető legyen tegyük megjegyzésbe a bind-address = 127.0.0.1-es sort: # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 invoke-rc.d mysql restart Újraindítás után ellenőrizzük: netstat -tap | grep mysql A kimenet ehhez hasonló kell legyen: tcp 0 0 *:mysql *:* LISTEN 19925/mysqld Vegyük észre a tcp 0 0 után a csillagot. A beállítás előtt itt localhost volt. Most le kell gyártani a tanúsítványokat, a my.cnf-ben beállítani azokat, megint újraindítani, majd készen vagyunk. mkdir /etc/mysql/certs && cd /etc/mysql/certs Telepítsük az openssl-t ha még nem lenne feltelepítve: apt-get install openssl CA tanúsítvány: openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem Szerver tanúsítvány: openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem Kliens tanúsítvány (amit a kliensek gépére másolhatunk): openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl ssl-ca=/etc/mysql/certs/ca-cert.pem ssl-cert=/etc/mysql/certs/server-cert.pem ssl-key=/etc/mysql/certs/server-key.pem GRANT ALL PRIVILEGES ON adatbazis.* TO 'felhasznalo'@'%' IDENTIFIED BY 'titok' REQUIRE SSL; A REQUIRE SSL opcionális. Ha megadjuk az SSL használata kötelező. ===== Karakterkódolás ===== ==== A karakterkódolásról ==== Előfordulhat, hogy bár az adatbázisunk UTF-8, a kliens program UTF-8-cal dolgozik mégis helytelenek a karakterek. Például szeretnénk MySQL adatbázisban tartani a Linux felhasználókat. Minden működik, de a grafikus bejelentkező felületen a teljes névnél az ékezetes karakterek helytelenül jelennek meg. Ha beállítjuk a my.cnf állományt a problémák megszűnnek: ==== A szerver beállításai ==== [mysqld] character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 Az utolsó mysql szakasz valójában a parancssoros mysql program beállítása. Ha változtattunk a szerver beállításain akkor ellenőrizhetjük a szintaktikailag helyes-e: service mysql stop mysqld --verbose --help 1>/dev/null ==== Konvertálás ==== ALTER DATABASE Adatbázisnév charset=utf8; mysqldump -uzoldzrt -ptitok -e -c --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B zoldzrt > dump.sql sed 's/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_hungarian_ci/' | sed 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/' > dump-fixed.sql mysql -uzoldzrt -ptitok < dump-fixed.sql ===== Idegenkulcs használata ===== ==== Hivatkozási integritás ==== A MySQL-ben hivatkozási integritás az idegenkulcs beállításával valósítható meg. Hivatkozási integritás: * új rekord felvétel csak akkor lehetséges, ha az idegenkulcsban megjelölt érték létezik a kapcsolt táblában * az elsődleges táblában nem módosítható az elsődleges kulcs értéke, ha a kapcsolt táblában hivatkoznak rá * az elsődleges táblából nem törölhetünk olyan rekordot, amelyre hivatkoznak egy másik táblából CREATE TABLE ugyfelek ( ugyfelAz INT NOT NULL, nev VARCHAR (50 ), PRIMARY KEY( ugyfelAz ) ) ENGINE=InnoDB CREATE TABLE rendelesek ( rendelesAz INT NOT NULL, koltseg INT, ugyfelAz INT NOT NULL, PRIMARY KEY(rendelesAz), INDEX ( ugyfelAz ), FOREIGN KEY(ugyfelAz) REFERENCES ugyfelek(ugyfelAz) ) ENGINE = InnoDB; ==== Kaszkádolt frissítés ==== Kapcsolt (kaszkádolt) frissítés, amikor mindkét kapcsolódó táblában egyszerre változtatjuk az értéket. ON DELETE CASCADE ON UPDATE CASCADE CREATE TABLE rendelesek ( rendelesAz INT NOT NULL, koltseg INT, ugyfelAz INT NOT NULL, PRIMARY KEY(rendelesAz), INDEX( ugyfelAz ), FOREIGN KEY(ugyfelAz) REFERENCES ugyfelek(ugyfelAz) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE = InnoDB ===== Operátorok ===== A MySQL precedencia szabályai alapján rendre: * BINARY * NOT * - (egyoperandusú operátor) * * / % * + - * << >> * & * | * < <= > >= = <=> <> IN IS LIKE REGEXP * BETWEEN * AND * OR ==== BINARY ==== mysql> SELECT 'a' = 'A'; -> 1 mysql> SELECT BINARY 'a' = 'A'; -> 0 mysql> SELECT 'a' = 'a '; -> 1 mysql> SELECT BINARY 'a' = 'a '; -> 0 ==== MOD ==== A MOD megfelel a % operátornak. Egy osztás maradékát kapjuk. select 3 % 2 select 3 MOD 2 Mindkettő eredménye: 1 ==== DIV ==== Egész osztás select 3 div 2 Eredménye: 2 ==== IS ==== Legyen a példa kedvéért egy ugyfelek tábla, amelyben van egy nev tábla. Ha a nev mező nincs megadva, akkor alapértelmezésben NULL értéket kap. Ekkor van értelme azon rekordok megjelenítésének, amelyek nincsenek megadva. SELECT * FROM `ugyfelek` WHERE nev IS NULL Tagadhatjuk is. Csak azon sorok megjelenítése, amelyek nem tartalmaznak NULL értéket. SELECT * FROM `ugyfelek` WHERE nev IS NOT NULL Ha egy mező nem tartalmaz NULL értékét, és nem is rendelkezik értékkel (üres karaktersorozat), akkor hagyományosan így kérdezzük le az üres sorokat: SELECT * FROM `ugyfelek` WHERE nev = "" ===== Függelék ===== ==== PHPMyAdmin nyelve ==== php_admin_value mbstring.func_overload 0 ==== MySQL szöveges típusokról ==== === Szöveges típusokról === | char() | Mindig a zárójelben, megadott méretet foglaljon a memóriában | | varchar() | Csak annyi helyet foglal a memóriában amilyen hosszú a tartalom + 1 byte \\ (255 karakter felett + 2 byte), \\ de max a zárójelben megadott méret | | text | Nem a rekord mellett tárolódik. Ott csak egy mutató lesz rá. | === Indexelés === Az "index prefix length" azt jelenti, az indexelés során csak ennyi karaktert szeretnénk figyelembe venni. A char és varchar esetén ezt nem kötelező megadni, text esetén viszont kötelező. === Fulltext (Teljes szöveg) index === A MySQL támogatja a full-text típusú keresést és indexelést. A full-text index egy MySQL index típus: FULLTEXT. A full-text index csak a MyISAM táblák esetén használhatók, azon belüli is CHAR, VARCHAR és TEXT típusú mezők esetén. A FULLTEXT index típus a CREATE TABLE utasításban kell megadni, vagy később az ALTER TABLE vagy CREATE INDEX utasításokban. Nagy adathalmazoknál gyorsabb az adatok betöltése FULLTEXT index mellett mint nélküle. A full-text keresés a MATCH() ... AGAINST segítségével valósítható meg. A MATCH zárójelében megadjuk azokat a mezőket vesszővel elválasztva, amelyekben keresni szeretnénk. Az AGAINST egy módosító, amelyet nem kötelező megadni, a keresés típusát állíthajuk be vele. A full-text keresésnek három típusa van: * logikai keresés * természetes nyelvi keresés * lekérdezés bővítő keresés Szintaxis: MATCH (mező1,mező2,...) AGAINST (expr [keresésmódosító]) Keresésmódosítók: { IN BOOLEAN MODE | WITH QUERY EXPANSION } Full-text mező beállítása: CREATE TABLE táblanév(mező1 TEXT,FULLTEXT(mező1)) TYPE=MyISAM; Full-text beállítása később: ALTER TABLE táblanév ADD FULLTEXT(mező1) ==== Tranzakció ==== Tárolt eljáráshoz szükséges: MySQL 5.0+ és MySQLi vagy PDO Az első utasítás (beszúrás) csak akkor lesz érvényes, ha a többi is sikeres. START TRANSACTION; INSERT INTO uj_tabla SELECT * FROM regi_tabla WHERE mezonev = 'kriterium'; DELETE FROM regi_tabla WHERE mezonev = 'kriterium'; COMMIT; A tranzakciót a Commit utasítással zárjuk. ==== Eljárás ==== DELIMITER $$ DROP PROCEDURE IF EXISTS `masolEsTorol` $$ CREATE PROCEDURE `masolEsTorol` (az INT) BEGIN INSERT INTO ujTabla SELECT * from regiTabla WHERE regiTabla.azMezo=az; DELETE FROM regiTabla where azMezo=az; END $$ DELIMITER ; A függvény meghívása: CALL masolEsTorol(4); ==== Kódolás ==== password("nyílt szöveg") md5("nyílt szöveg") SHA = Secure Hash Algorithm Ah sha1() függvény 160 bit hosszú hasht állít elő. sha1("nyílt_szöveg"); Ajánlott: sha2() függvény használata. Szintaxisa: sha2("nyílt_szöveg", bitek_száma) Az SHA-224, SHA-256, SHA-384, és SHA-512 család különböző hosszúságú formáival használhatjuk. ==== Néhány információs függvény ==== select version() select database() select user() ==== Néhány információ ==== show variables; show variables like "autocommit"; select @@autocommit A rendszerváltozókat két kukackarakterrel tudjuk megjeleníteni. A tranzakciók izolációs szintje: select @@tx_isolation; select @@global.tx_isolation; Teljesítmény vizsgálat: SELECT BENCHMARK(1000000,ENCODE('hello','goodbye')); ===== Külső hivatkozások ===== * http://dev.mysql.com/doc/ * http://dev.mysql.com/doc/refman/5.6/en/ * http://dev.mysql.com/doc/refman/5.6/en/show.html * http://dev.mysql.com/doc/refman/5.6/en/connector-j-reference-using-ssl.html (SSL) * http://www.thegeekstuff.com/2008/11/overview-of-mysql-information_schema-database-with-practical-examples/ (information_scheam) * http://nullstring.blog.hu/2009/03/06/triggerek_tarolt_eljarasok_fuggvenyek_mysql_ben_1 * http://nullstring.blog.hu/2009/02/12/jabber_mysql_auto_add_contact_on_register * http://nullstring.blog.hu/2008/02/20/kereses_mysql_adatbazisban_ekezetek_es_html_tag_ek_mint_zavaro_tenyezok * http://support.modwest.com/content/6/253/en/how-do-i-import-delimited-data-into-mysql.html (Importálás) * http://lcb.hu/linux/sql_alapok.html * http://www.stud.u-szeged.hu/Palatinus.Endre/db/PHP_MySQL_halado.pdf * http://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-debian-lenny (SSL) * http://stackoverflow.com/questions/4663061/mysql-jdbc-over-ssl-problem (SSL használata) * http://php.net/manual/en/configuration.changes.php (PHP beállítások cseréje) * http://wiki.phpmyadmin.net/pma/Config (PhpMyAdmin konfig) * http://www.phpmyadmin.net/documentation/ (PhpMyAdmin használat) * http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html (Full-text keresés) * http://www.databasejournal.com/sqletc/article.php/1578331/Using-Fulltext-Indexes-in-MySQL---Part-1.htm * http://www.jveweb.net/en/archives/2011/03/managing-mysql-from-the-command-line.html (MySQL parancssorból)