2013-08-25 55 views
1

保護反引號我有一個自定義的MySQL備份腳本,該腳本的一部分,應該執行這樣的說法(有意刪除。廣州):在替代

mysql -uroot -pmypass -e "CREATE DATABASE IF NOT EXISTS `basename -s .gz test-db.gz`" 

,但它不能正常工作,併產生一個錯誤:

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 '-db' at line 1 

我知道問題是用連字符「 - 」分隔test和db。

而這個語句的工作

mysql -uroot -pmypass -e "CREATE DATABASE IF NOT EXISTS \`test-db.gz\`" 

那麼,如何讓上面的語句工作,包括命令替換我需要什麼?

回答

4

背後的原因是,mysql不允許你創建一個名稱包含連字符的數據庫。解決這個問題的方法是用MYSQL中帶有特殊含義的反引號括起DB名稱來轉義保留字。

反引號在shell中有另外一個用於命令替換的含義,因此在這種情況下,我們需要求助於命令或嵌套反引號使用$()表示法,我個人更喜歡前者,因爲它更易讀也是由於2013年反引號在$()語法中被棄用的事實。

我設法重現了你面臨的問題,以下命令對我來說工作正常。在這裏,我們逃避反引號這樣shell不會解釋他們命令替換,而MySQL的仍然會使用他們作爲一個指標來逃避「 - 」,在「測試數據庫」

mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS \`$(basename -s .gz test-db.gz)\`" 

mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS \``basename -s .gz test-db.gz`\`" 

但是,如果以後您需要刪除該數據庫或對其執行任何數據庫級別的操作,則需要使用反引號括起數據庫名稱,例如

drop database `test-db`; 

這裏是一個link在MySQL中關於一個錯誤在DB名稱

+0

難道我得到它的權利,你可以用單引號括起來的數據庫名稱,以及有連字符?現在不能測試它 –

+0

是的,這是正確的,除了反引號「不是單引號」。試了一下,它確實有效。目的是爲了逃避名稱中的任何保留字,在這種情況下是「 - 」。對於drop語句,如果你省略反引號,它會給你最初的錯誤。 –

+0

如果它確實對你有用,你能否接受答案,讓面對與你同樣問題的人更加明白。 –