字符串包含引号时的SQL异常(无法识别的标记)

时间:2012-10-24 14:45:44

标签: android mysql sqlexception

当我使用我的函数从“mysql.db”检索数据时,我收到了SQL异常(无法识别的标记)。当String 地址在其中有引号时会发生异常。

我已经尝试更改此行

KEY_ADDRESS + "='" + address + "'",

KEY_ADDRESS + "=\"" + address + "\"",

它解决了包含单引号(')和(`)的字符串的问题,但是为包含双引号(“)的字符串创建了另一个问题。

我尝试使用

DatabaseUtils.sqlEscapeString(address);

没有效果。

我尝试使用此问题中的 escape 函数:How do I escape special characters in MySQL?,但它不起作用。

这是我的代码:

public Cursor getNameFromAddress(String address) throws SQLException
{
    Cursor mCursor =
            db.query(DATABASE_TABLE_PRINC, new String[] {
                    KEY_ROWID,
                    KEY_NAME,
                    KEY_ADDRESS
                    },
                    KEY_ADDRESS + "='" + address + "'",
                    null,
                    null,
                    null,
                    null,
                    null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

3 个答案:

答案 0 :(得分:5)

那些selectionArgs / whereArgs旨在用于此目的:

Cursor mCursor =
        db.query(DATABASE_TABLE_PRINC, new String[] {
                KEY_ROWID,
                KEY_NAME,
                KEY_ADDRESS
                },
                KEY_ADDRESS + "=?",
                new String[] { address },
                null,
                null,
                null,
                null);

将所有"='" + stuff + "'"替换为"=?"并将数据按照?

中必须填写的顺序填充String[] 然后

?将自动替换为转义字符串数据。

答案 1 :(得分:2)

缺少“?”符号

Cursor mCursor =
        db.query(DATABASE_TABLE_PRINC, new String[] {
                KEY_ROWID,
                KEY_NAME,
                KEY_ADDRESS
                },
                KEY_ADDRESS + "=?" ,
                new String[]{address},
                null,
                null,
                null,
                null);

答案 2 :(得分:2)

queryText = "select * from yourtable where address = ?";
mDb.rawQuery(queryText, new String[] {addressValue}); 

通过这种方式,您可以解决问题并保护系统免受SQL注入攻击。