Почему происходит так, что аргумент командной строки, переданный классу Java, кажется автоматически экранированным, в то время как в экземпляре объекта String экранирующий символ () по-видимому игнорируется.
Например, если начать с такой строки:
SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'
И я пытаюсь запустить его через простой класс, например:
public class EscapeTest {
public static void main (String[] args) {
String str = "SELECT * FROM my_table WHERE "
+ "my_col like 'ABC_\' ESCAPE '\'";
System.out.println("ARGS[0]: "+args[0]);
System.out.println("STR: "+str);
}
}
и я передаю оператор «SELECT» выше в качестве аргумента командной строки, я получаю вывод, который выглядит следующим образом:
ARGS[0]: SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'
STR: SELECT * FROM my_table WHERE my_col like 'ABC_' ESCAPE ''
Если я посмотрю на значение ARGS[0] в отладчике Eclipse, я увижу, что косые черты экранированы. Почему это происходит? По-моему, трудно предсказать.