J'essaie de créer une nouvelle base de données via bash qui a un tiret dans le nom.
C'est ce que j'ai essayé:
echo "CREATE DATABASE IF NOT EXISTS db-name CHARACTER SET utf8 COLLATE utf8_general_ci" | mysql -uuser -ppw
Cela échoue avec l'erreur suivante:
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
'-name CHARACTER SET utf8 COLLATE utf8_general_ci' at line 1
J'ai ajouté des backticks alors:
echo "CREATE DATABASE IF NOT EXISTS `db-name` CHARACTER SET utf8 COLLATE utf8_general_ci" | mysql -uuser -ppw
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
'CHARACTER SET utf8 COLLATE utf8_general_ci' at line 1
J'ai joué un peu et j'ai découvert que MySQL n'aimait pas les backticks, même sans le tiret:
echo "CREATE DATABASE IF NOT EXISTS `dbname` CHARACTER SET utf8 COLLATE utf8_general_ci" | mysql -uuser -ppw
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
'CHARACTER SET utf8 COLLATE utf8_general_ci' at line 1
Je suis un peu confus. Quel est le problème ici?
PS: Dans phpmyadmin cela fonctionne comme prévu lors de l'ajout de backticks
Soit vous citez les guillemets ou utilisez simplement des guillemets simples au lieu de guillemets doubles autour de la commande:
mysql -uuser -ppw -e 'CREATE DATABASE IF NOT EXISTS `db-name` CHARACTER SET utf8 COLLATE utf8_general_ci'
Sinon, le shell développerait les backticks pour une substitution de commande. Vérifiez ceci: http://tldp.org/LDP/abs/html/commandsub.html
Notez également que vous n'avez pas besoin de la commande echo. Vous pouvez utiliser l'option -e
de la ligne de commande mysql
Utiliser avec les backslahes avant les backticks:
mysql -uuser -ppw -e 'CREATE DATABASE IF NOT EXISTS \`db-name\` CHARACTER SET utf8 COLLATE utf8_general_ci'