Задача
Вы хотите создать строку, заключенную в кавычки, но оказывается, что она содержит кавычки или другие специальные символы, и MySQL ее отвергает.
Решение
Изучите правила синтаксиса, регулирующие обработку строк в запросах.
Обсуждение
Чтобы вставить строку в предложение SQL, заключите ее в кавычки:
mysql> SELECT 'hello, world';
+--------------+
| hello, world |
+--------------+
| hello, world |
+--------------+
Но бывает так, что сама строка содержит кавычки, тогда, если заключить ее в кавычки «как есть», будет выдана синтаксическая ошибка:
mysql> SELECT 'I'm asleep';
ERROR 1064 at line 1: You have an error in your SQL syntax near 'asleep''
at line 1
Исправить положение можно несколькими способами:
• В отличие от некоторых других процессоров SQL, MySQL позволяет использовать как одинарные, так и двойные кавычки, так что вы можете заключить строку, содержащую одинарные кавычки, в двойные:
mysql> SELECT "I'm asleep";
+------------+
| I'm asleep |
+------------+
| I'm asleep |
+------------+
Можно сделать и наоборот: заключить строку, содержащую двойные кавычки, в одинарные:
mysql> SELECT 'He said, "Boo!"';
+------------------+
| He said, "Boo!" |
+------------------+
| He said, "Boo!" |
+------------------+
• Для того чтобы включить символ кавычки в строку, заключенную в кавычки того же типа, следует или продублировать кавычку, или поставить перед ней символ обратного слэша (\). MySQL, прочитав строку запроса, уберет дополнительную кавычку или обратный слэш:
mysql> SELECT 'I''m asleep', 'I\'m wide awake';
+------------+-------------------+
| I'm asleep | I'm wide awake |
+------------+-------------------+
| I'm asleep | I'm wide awake |
+------------+-------------------+
1 row in set (0.00 sec)
mysql> SELECT "He said, ""Boo!""", "And I said, \"Yikes!\"";
+------------------+-----------------------+
| He said, "Boo!" | And I said, "Yikes!" |
+------------------+-----------------------+
| He said, "Boo!" | And I said, "Yikes!" |
+------------------+-----------------------+
Обратный слэш отключает специальную интерпретацию следующего за ним символа. (Происходит как бы временный уход от обычных правил обработки строк, поэтому такие последовательности, как \' и \" называют escape последовательностями.) Соответственно сам обратный слэш тоже является специальным символом, и чтобы буквально использовать его внутри строки, вы должны продублировать его:
mysql> SELECT 'Install MySQL in C:\\mysql on Windows';
+----------------------------------------------+
| Install MySQL in C:\mysql on Windows |
+----------------------------------------------+
| Install MySQL in C:\mysql on Windows |
+----------------------------------------------+
MySQL также распознает такие управляющие последовательности, как \b (backspace, забой), \n (перевод строки, или новая строка), \r (возврат каретки), \t (табуляция) и \0 (ASCIIноль, NUL).