Category Archives

17 Articles

MySQL/MariaDB: Jaký je rozdíl mezi INNER JOIN, LEFT JOIN a RIGHT JOIN? Tady je úžasná vizualizace!

by Zdeněk Večeřa 1 Comment

Rozdíl mezi jednotlivými typy spojení tabulek je obrovský, protože vám vrátí odlišné záznamy. Nejčastěji se můžete setkat s INNER JOIN a LEFT JOIN, využívané jsou také RIGHT JOIN a OUTER JOIN, ale existují i složitější konstrukce LEFT JOIN EXCLUDING INNER JOIN, RIGHT JOIN EXCLUDING INNER JOIN a OUTER JOIN EXCLUDING INNER JOIN.

Jejich pochopení vám ulehčí následující vizualizace. A když ještě správně nastavíte indexy, databázový server vás bude zbožňovat.

V čem upravovat velké textové SQL dump soubory? (edit big files)

Editace a prohlížení velkých textových souborů (1 GB+) není žádná legrace. Představte si, že máte před sebou textový soubor s SQL dumpem databáze a potřebujete v něm pod Windows něco upravit.

Jestli je soubor v řádu jednotek nebo maximálně desítek megabytů, můžete zkusit český PSPad (v 4.5.6) nebo lépe Notepad++ (v 5.9.6.2).

Pokud ale musíte pracovat s dumpy, které mají stovky megabytů nebo jednotky gigabytů, rovnou na výše dva zmíněné programy zapomeňte. Potřeboval jsem pracovat s dumpem o velikosti cca 700 MB a ani jeden si s ním neporadil (ne že bych čekal něco jiného).

UTF-8, MySQL, kódování a PHP funkce pro práci s řetězci: strlen, substr aj.

Možná jste při práci s PHP narazili na problém s UTF-8 kódováním. Doposud jste využívali kódování cp1250 nebo iso-8859-2 a nebyl problém. Okolnosti vás přinutily požívat UTF-8 a najednou bum. Na stránkách se vám chybně vypisují znaky s českou diakritikou a nevíte co s tím.

Jak správně použít UTF-8 a MySQL?

Je třeba dodržet následující pravidla:

  1. Po připojení nastavit kódování, ve kterém bude probíhat komunikace s databázovým serverem:
    mysql_query("SET NAMES 'utf8'");
    nebo 
    mysql_query('SET CHARACTER SET utf8');
    
    Od PHP 5.2.3 a MySQL 5.0.7 raději použijte:
    mysql_set_charset('utf8');
    
    Je to správná a bezpečná varianta
    pro použití mysql_real_escape_string(). Více: 1, 2, 3.
  2. Kódování PHP souborů nastavit na UTF-8 (pozor na počáteční UTF-8 boom znak)
  3. Odesílat hlavičky s UTF-8 kódováním:
    header('Content-Type: text/html; charset=utf-8');
  4. Nastavit UTF-8 kódování v HTML (meta tagy, xml hlavička aj.)
  5. Používat PHP řetězcové funkce, které zvládají UTF-8 (viz dále)

MySQL: Rychlost UPDATE sloupce v závislosti na přítomnosti indexů

Nedávno jsme s Lukášem Churým a Ondrou Vašíčkem řešili rychlost operace UPDATE v závislosti na tom, jestli upravovaný sloupec má či nemá nastavený index.

Představte si, že máme v MySQL 5.0 tabulku o několika sloupcích, dva z nich jsou “id” a “xy”. Nad sloupcem “id” je přidělený index. Sloupec “xy” index nemá. Rychlost UPDATE sloupce “xy” trvá nějaký čas.

Otázka zní, jestli UPDATE zabere stejný čas i v případě, kdyby sloupec “xy” měl přidělený index.

Udělal jsem jednoduchý test, který přináší odpověď.

Jak na to: SQL injection, magic_quotes_gpc, addslashes() a stripslashes()

V názvu článku jsem vyjmenoval slova, která jsou strašákem nejednoho PHP programátora. Strašák to je ale pouze uměle vytvořený, vycházející z neznalosti problematiky.

Dost často se ve spojení s SQL injection (typ útoku hackera) zmiňuje PHP konstanta magic_quotes_gpc. Prý, že pokud je zapnutá, tak se dá SQL injection předejít. A víte, že od PHP 5.3 bude standardně magic_quotes_gpc vypnutá?

Znamená to, že poté budou SQL dotazy napadnutelné pomocí SQL injection? Ale vůbec ne.

Konstanta magic_quotes_gpc totiž s ochranou SQL injection nemá v podstatě nic společného. Pouze zde existuje průsečík v možnosti jejího využití. Proto ji neznalí programátoři začali přisuzovat větší váhu, než má. Váha magic_quotes_gpc je samozřejmě nulová, zvláštně, když od PHP 5.3 bude vypnutá a v PHP 6 zanikne úplně.

Vysvětleme si tedy, oč jde. SQL injection je vážný problém.

MySQL: Pokud záznam neexistuje, vytvoř nový. Jinak původní aktualizuj

by Zdeněk Večeřa 7 Comments

Typický příklad. Máme tabulku, kam ukládáme nějaké záznamy o činnosti uživatele. Tentokrát třeba návštěvu vlákna ve fóru, spolu s časem a počtem příspěvků ve vláknu.

Pokud takový záznam neexistuje (vázaný na ID uživatele a ID vlákna), tak vytvoříme nový záznam (INSERT), jinak provedeme aktualizaci záznamu (UPDATE), tedy čas a počet příspěvků.

Nabízí se několik možností, jak tento proces provést.

Možnost A

  1. Zjistit, jestli záznam existuje (SELECT COUNT(*)…)
  2. Pokud existuje, provést aktualizaci (UPDATE)
  3. Pokud neexistuej, vložit nový (INSERT)

Všetři tři kroky uzavřeme do stransakce (viz Jakub Vrána).

Možnost B

  1. Provést aktualizaci (UPDATE)
  2. Zjistit počet ovlivněných řádků (mysql_affected_rows())
  3. Pokud “nula” (záznam neexistuje), tak provedeme vložení nového (INSERT)