Kut SQL

In de afgelopen maanden dat ik met SQL MariaDB werkte, heb ik er een lichte hekel aan gekregen. Lees hier waarom.

Unicode is niet unicode

Een column met tekst wordt by default opgeslagen in utf8-general-ci. Hartstikke mooi, maar dit is helemaal geen utf8. Dit is een subset van utf8. Je moet eigenlijk overal utf8mb4 gebruiken als charset en utf8mb4_col als collation. Waarom? Geen flauw fucking idee. Je moet trouwens ook al je connections in php wijzigen zodat hij niet gaat verbinden met de verkeerde charset en je data verminkt (want default is de nep-utf8). Hoe ik hierachter kwam? Een fucking emoji in een comment. Zelfs arme artikelen zoals "Nédurlants" (RIV) zijn erdoor geveld. Kom op jongens, het is 2019.

Tellen vanaf 1

Het is vrij standaard (kuch lua kuch) voor programmeertalen om te beginnen met tellen bij 0. SQL doet dit niet; die begint bij 1. Dat kan misschien mijn eigen fout zijn, of een fout in phpMyAdmin, de tool die ik gebruik om direct wijzigingen te maken in de database. Tot nu toe heeft het niet tot problemen geleid, maar het is wel zo'n dingetje.

Prepared is niet prepared

Oké, dit ligt meer aan php dan aan SQL, maar toch. Als je in je php een PDO gebruikt (zoals het hoort) dan zul je hopelijk niet, maar waarschijnlijk wel, merken dat prepared niet prepared is. Als je het veilig wilt doen moet je het digitale equivalent van een dubbel condoom gebruiken:

$options = [PDO::ATTR_EMULATE_PREPARES => false];
$pdo = new PDO($db, "username", "password", $options);

Waarom is dit een ding!??

Non-descripte errors

In het maken van mijn post-, tag- en commentsystemen heb ik menigeen SQL errors moeten oplossen. Vaak bond ik te weinig values aan mn insert, of iets dergelijks stoms. In plaats van te zeggen dat ik te veel, te weinig, of illegale values probeer te selecten of inserten, zegt hij "ERROR NEAR X". Ja, daar heb ik wat aan. Het enige wat je echt kan doen is je statements goed opsplitsen op meerdere regels, en dan kijken bij welke regel hij zeurt.

2019-06-14 in blog #database #PHP #SQL #UTF-8 #prepared-statements