Tartalomjegyzék
MySQL jegyzet
- Szerző: Sallai András
- Copyright © 2012, Sallai András
- Szerkesztve: 2012, 2014, 2015
- Licenc: 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
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
- /etc/mysql/my.cnf
[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/' <dump.sql \ > | 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
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
<Directory /home/virtual-www/domain/htdocs> <IfModule mod_php5.c> php_admin_value mbstring.func_overload 0 </IfModule> </Directory>
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://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.jveweb.net/en/archives/2011/03/managing-mysql-from-the-command-line.html (MySQL parancssorból)