Как избежать одиночных кавычек для вставки SQL... когда строка для вставки находится в пользовательской переменной

Я создаю команду вставки для выполнения с помощью jdbc. Часть его состоит в объединении созданной пользователем строки... это все работает, пока пользователь не использует такую строку:

A'BCD

String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
                            + "(insertColumn) " 
                            + "VALUES("
                                +"'"+userString+"'"
                                +")";

statement.executeUpdate(insertTableSQL);

Ответ 1

Вы можете выполнить одно из следующих действий:

  1. Используйте класс PreparedStatement. (Рекомендуемые)

    String userString="a'bcd";
    String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)";
    PreparedStatement statement= con.prepareStatement   (myStatement );
    statement.setString(1,userString);
    statement.executeUpdate();
    
  2. Побег одиночных кавычек.

    В 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>

Выход:

&lt;sometext&gt;
Here is some &quot;Text&quot; that I'd like to be &quot;escaped&quot; for HTML
&amp; here is some Swedish: Tack. Vars&aring;god.
&lt;/sometext&gt;

Ответ 3

Вот еще один вариант:

Используйте собственный метод Android, предназначенный именно для этой цели:

DatabaseUtils.sqlEscapeString(String)

Вот документация для него онлайн:

Главным преимуществом использования этого метода, на мой взгляд, является самодокументация из-за явного имени метода.


String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
                            + "(insertColumn) " 
                            + "VALUES("
                                +"'"+DatabaseUtils.sqlEscapeString(userString)+"'"
                                +")";

statement.executeUpdate(insertTableSQL);