Как избежать одиночных кавычек для вставки SQL... когда строка для вставки находится в пользовательской переменной
Я создаю команду вставки для выполнения с помощью jdbc. Часть его состоит в объединении созданной пользователем строки... это все работает, пока пользователь не использует такую строку:
A'BCD
String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
+ "(insertColumn) "
+ "VALUES("
+"'"+userString+"'"
+")";
statement.executeUpdate(insertTableSQL);
Ответы
Ответ 1
Вы можете выполнить одно из следующих действий:
-
Используйте класс PreparedStatement. (Рекомендуемые)
String userString="a'bcd";
String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)";
PreparedStatement statement= con.prepareStatement (myStatement );
statement.setString(1,userString);
statement.executeUpdate();
-
Побег одиночных кавычек.
В SQL одинарные кавычки будут экранированы с помощью двойных одинарных кавычек. '
→ ''
String userString="a'bcd";
String changedUserString = userString.replace("'","''");
//changedUserString = a''bcd
String insertTableSQL = "INSERT INTO myTable (insertColumn) VALUES("
+" '"+changedUserString +"' )";
Ответ 2
Вы можете использовать StringEscapeUtils из библиотеки Apache Commons Lang. Используя это, вы можете избежать символов из html, xml, sql и т.д. Ищите метод escapeXXX
для вашей цели. Для справки: когда мне нужно избежать строки HTML?
note: escapeSql
был удален в Apache Commons Lang 3 (см. Миграция StringEscapeUtils.escapeSql из commons.lang, который ссылается на https://commons.apache.org/proper/commons-lang/article3_0.html#StringEscapeUtils.escapeSql)
Например:
String str = FileUtils.readFileToString(new File("input.txt"));
String results = StringEscapeUtils.escapeHtml(str);
System.out.println(results);
Входные данные:
<sometext>
Here is some "Text" that I'd like to be "escaped" for HTML
& here is some Swedish: Tack. Vars?god.
</sometext>
Выход:
<sometext>
Here is some "Text" that I'd like to be "escaped" for HTML
& here is some Swedish: Tack. Varsågod.
</sometext>
Ответ 3
Вот еще один вариант:
Используйте собственный метод Android, предназначенный именно для этой цели:
DatabaseUtils.sqlEscapeString(String)
Вот документация для него онлайн:
Главным преимуществом использования этого метода, на мой взгляд, является самодокументация из-за явного имени метода.
String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
+ "(insertColumn) "
+ "VALUES("
+"'"+DatabaseUtils.sqlEscapeString(userString)+"'"
+")";
statement.executeUpdate(insertTableSQL);