Какие символы нельзя использовать для значений в базах данных SQLite? - PullRequest
5 голосов
/ 01 сентября 2011

Я создаю приложение для Android и использую базу данных SQLite.Но я обнаружил, что если вы вводите символы, такие как одинарные кавычки ('), (также для использования в качестве первичного ключа), данные не будут сохранены / извлечены правильно.

Это проблема со мной или этоправда?Если это правда, есть ли еще такие символы?

Спасибо.

@ bdares и @mu Спасибо за советы, но не могли бы вы рассказать мне, как использовать заполнители и / или подготовленные выраженияв SQLite?

Раньше я всегда использовал прямую конкатенацию строк, но сейчас, как оказалось, это плохая практика, я хотел бы использовать подготовленные операторы и / или заполнители.

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Возможно, у вас будут проблемы с такими символами, как ASCII STOP и такими непечатными символами, но если вы будете использовать подготовленные операторы и привязку параметров, у вас не возникнет никаких проблем даже с такими символами, как '.

Если вы не хотите использовать привязку параметров и подготовленные операторы, вы можете заменить все свои входные данные ' на \', и все будет в порядке.

SQL обычно использует ' в качестве своего специального символа, чтобы сообщить, когда строковый литерал начинается или останавливается. Если ваш ввод имеет этот символ, он прекратит обрабатывать текущую строку как строку и начнет обрабатывать ее как команды. Это не очень хорошая вещь, с точки зрения безопасности. Он также удерживает вас от ввода этого символа, если вы не «экранируете» его, поставив перед ним обратную косую черту, которая говорит SQL игнорировать ' и продолжать обрабатывать следующие символы как строку до тех пор, пока не встретится неэкранированный '. Конечно, литералы обратной косой черты также экранируются как двойные обратные косые черты.

Подготовленные заявления обычно выглядят так:

String sql = "INSERT INTO MYTABLE (NAME, EMP_NO, DATE_HIRED) VALUES (?, ?, ?)";
PreparedStatement ps = sqlite.prepareStatement(sql);
ps.setString(1, myString);
ps.setInt(2, myInt);
ps.setDate(3, myDate);
ps.executeUpdate();

К сожалению, я точно не знаю, какую библиотеку вы будете использовать для доступа к sqlite с Android, поэтому сейчас я не могу дать вам более подробную информацию.

1 голос
/ 02 сентября 2011

В операторах SQLite для строк используются кавычки - одинарные или двойные. Если вам нужно, например, вставить строку с ('), вы можете использовать двойные кавычки (") для переноса строки:

INSERT INTO my_table (some_column) VALUES("'a string'");

Или наоборот:

INSERT INTO my_table (some_column) VALUES('"a string"');

(Конечно, вам нужно будет экранировать любые (") в вашем Java-коде.)

Альтернативой является использование SQLiteStatment (подготовленный оператор) и bindString ()

Что касается «разрешенных символов», SQLite внутренне сохраняет строки (типа TEXT) как UTF-8 или UTF-16. В сборке Android используется стандарт UTF-8. Для этого вы можете хранить любую строку, какую пожелаете.

0 голосов
/ 01 сентября 2011

SQLite поддерживает типы данных TEXT (аналогично String в Java), INTEGER (аналогично long в Java) и REAL (аналогично double в Java).Все остальные типы должны быть преобразованы в одно из этих полей перед сохранением их в базе данных.Сам SQLight не проверяет, если типы, записанные в столбцы, на самом деле имеют определенный тип, вы можете записать целое число в строковый столбец.

...