sql
MariaDB Create Database
Eine Datenbank anlegen geht ganz einfach
MariaDB [(none)]> create database db1; Query OK, 1 row affected (0.001 sec)
Außer es soll ein Bindestrich im Datenbanknamen vorkommen
MariaDB [(none)]> create database db-1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-1' at line 1
Vielleicht helfen Anführungszeichen
MariaDB [(none)]> create database "db-1"; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"db-1"' at line 1
Oder einfache Hochkommata
MariaDB [(none)]> create database 'db-1'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''db-1' at line 1
Oder mit einem Schrägstrich quotieren
MariaDB [(none)]> create database 'db\-1'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''db\-'' at line 1
Oder so was
MariaDB [(none)]> create database ´db-1´; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-1´' t line 1
Nein, es müssen Backticks sein
MariaDB [(none)]> create database `db-1`; Query OK, 1 row affected (0.001 sec)
Ist doch logisch!?
SQL NULL-SAFE
Liefert keine Felder zurück, wo eines oder beide Felder NULL sind:
select usr_id from usr_data where (usr_data.a != usr_data.b);
NULL-SAFE – schlägt auch an, wenn eines der Felder NULL ist:
select usr_id from usr_data where NOT (usr_data.a <=> usr_data.b);
SQL Query in Crontab
Soll ein Cronjob eine SQL Query ausführen, läuft man schnell in ein Problem. Das Prozenzeichen % hat eine Sonderbedeutung in der Crontab. Es erzeugt einen Zeilenumbruch. Das folgende Beispiel funktioniert niemals, weil der Suchbegriff falsch interpretiert wird und ausserdem alles nach dem Suchbegriff abgeschnitten wird:
Hier ein Beispiel:
mysql -e "SELECT * FROM users WHERE name LIKE a%;" database
Ich konnte diesen nicht wirklich schönen Workaround dafür finden.
echo "SELECT * FROM users WHERE name LIKE a\%;" | sed -e 's|\\||g' | mysql database
Das Prozenzeichen wird vor Cron geschützt. sed löscht das quote Zeichen wieder, bevor es an die Datenbank weitergeschickt wird.
Für ganz einfache Dinge reicht das. Ich empfehle aber trotzdem gleich ein Script zu erstellen. Dadurch wird dieser komplexe Teil unnötig und insgesamt besser lesbar.