Felhasználói eszközök

Eszközök a webhelyen


oktatas:adatbazis-kezeles:mysql:mysql_jegyzet

< MySQL

MySQL jegyzet

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

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

<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

oktatas/adatbazis-kezeles/mysql/mysql_jegyzet.txt · Utolsó módosítás: 2023/08/21 10:19 szerkesztette: admin