PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scripting: SQL-Zeichen



Stiftmaster
05.03.09, 22:04
Hallo,

in einem Script steht bisher folgende Zeile drin:


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse "show tables from $db"`

Diese läuft machte bisher auch keine Probleme. Jetzt ist allerdings eine Tabelle "test-test" hinzugekommen und damit ist das Problem des Bindestriches aufgetreten.

Wenn ich unter phpMyAdmin eingebe


show tables from test-test

dann erhalte ich auch eine Fehlermeldung. Gebe ich allerdings


show tables from `test-test`

ein, dann werden alle Tabellen korrekt ausgegeben. Nun wollte ich dieses Hochkomma auch in das Script einbauen, aber dort funktioniert dies leider nicht, da dies bereits für andere Zwecke reserviert ist.

Daher frage ich mich jetzt - wie kriege ich das Hochkomma in das Script rein.

Vielen Dank für eure Mühen

Stefan

HirschHeisseIch
05.03.09, 22:49
Escapen...


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse "show tables from \'$db\'"`
Irgendwas in der Form eben... ;)

Stiftmaster
06.03.09, 07:48
Hi,

vielen Dank für den Tipp. Ich habe nun folgendes eingegeben:


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse "show tables from \'$db\'"`

Dann erhalte ich den Fehler:


ERROR at line 1: Unknown command '\''.

Daraufhin habe ich die Zeile wie folgt angepasst:


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse "show tables from \`$db\`"`

erhalte dann aber folgenden Fehler


mysql_backup.sh: line 1: test-test: command not found
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Hat jemand n' Ahnung, was ich falsch mache - weil so habe ich das "Escapen" verstanden.

Dankend

Stefan

marce
06.03.09, 07:50
in dem Fall kannst Du die \ AFAIK weglassen - Versuch schadet auf jeden Fall nicht...

Alternativlösung: In Tabellen- und Datenbanknamen Zeichen vermeiden, die Probleme bereiten. Also die Tabelle eher test_test anstatt test-test nennen...

Stiftmaster
06.03.09, 07:53
Hi,

wenn ich allerdings


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse "show tables from `$db`"`

eingebe, dann erhalte ich folgenden Fehler:


mysql_backup.sh: command substitution: line 1: unexpected EOF while looking for matching `"'

weil der dann das ` als Ende des Befehls ansieht, was es ja nicht ist. Oder sehe ich dies falsch?

Dankend

Stefan

marce
06.03.09, 07:55
Du sollst ja auch nicht ` sondern ' nehmen. - also das Ding, was man über [SHIFT]-# bekommt...

Stiftmaster
06.03.09, 08:03
Hi,

ok - noch ein versuch. Diesmal folgende Zeile:


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse "show tables from '$db'"`

und als Fehler erhalte ich dann:


ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test-test'' at line 1[code]

Wenn ich in phpMyAdmin

[code]show tables from 'test-test'

eingebe, dann erhalte ich auch die gleiche Fehlermeldung. Nur wenn dort mit ' durch ` ersetzt wird (wie in meinem ersten Post) klappt der Befehl.

Dankend

Stefan

marce
06.03.09, 08:11
dann könntest Du versuchen, nicht über die Backtickets die Ausgabe abzufangen sondern über $() - dann solltest Du innendrin "problemlos" die ` verwenden können...

Stiftmaster
06.03.09, 08:21
Hi,

vielen Dank für deinen Beitrag. Was meinst du mit "Backtickets"? Konnte dem nicht so ganz folgen. Habe jetzt mal folgende Zeile eingegeben:


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse 'show tables from $(`db`)'`

und auch


TABLE_LIST=`mysql -u$MYUSER -p$MYPASS -Bse 'show tables from $(\`db\`)'`

Aber auch dies scheitert wieder, gehe aber hier von falschem Verständnis deines Posts aus :-) Magst du mir da noch auf die Sprünge helfen, was du meinst - Scripting ist nicht so ganz mein Fall! Kämpfe mich da grad so durch bzw. fange damit an.

Dankend

Stefan

marce
06.03.09, 08:34
ich meinte eigentlich eher TABLE_LIST=$(...`...`)

` sind die Backtickets.


Vorlesung Shell-Grundlagen, zweite Stunde :-)

Stiftmaster
06.03.09, 08:42
Hi,

du hast mir die Augen geöffnet! Vielen Dank dafür. Bis zur zweiten Stunde bin ich noch net vorgedrungen - bin so bei den ersten 15 Minuten der ersten Stunde. Kann zwar grundsätzlich sehr gut Delphi und C# coden, aber wenn's an der Syntax liegt, dann hilft einem diese Erfahrung auch nicht immer viel weiter :-)

Folgende Zeile hat zum Erfolg geführt:


TABLE_LIST=$(mysql -u$MYUSER -p$MYPASS -Bse "show tables from \`$db\`")

Wenn ich die \ weglasse, dann interpretiert er die ` auch als Befehl und möchte den ausführen und dies führt natürlich dann zum Fehler.

Vielen Dank für alles. Wieder ein kleiner Schritt weiter :-)

Stefan

HirschHeisseIch
06.03.09, 09:43
Und hättest statt den Backticks die Single-Quotes (') genommen, hättest auch das Problem nicht. ;)

marce
06.03.09, 09:53
lt. #7 (http://www.linuxforen.de/forums/showpost.php?p=1700794&postcount=7) wollte das auch nicht... Hatte ich ihm auch schon vorgeschlagen...

HirschHeisseIch
06.03.09, 10:12
Naja, vielleicht hätt man das '-' auch noch escapen müssen...
Mir fällt grad auf, dass ich noch nie solche Zeichen in ner SQL-DB benutzt hab... :D