Я пытаюсь создать запись, содержащую путь к файлу. Вставка выполняется в базу данных Postgres
, где включен UTF8, используя драйвер NpqSQL
.
Определение моей таблицы:
CREATE TABLE images
(
id serial,
file_location character varying NOT NULL
)
Мой оператор SQL, включая код, который его выполняет (сведен к минимуму):
string sqlStatement = "INSERT INTO images (file_location) VALUES ('\\2010')";
NpgsqlConnection dbConnection = new NpgsqlConnection(connectionString);
dbConnection.Open();
NpgsqlCommand dbCommand = new NpgsqlCommand(sqlStatement , dbConnection);
int result = dbCommand.ExecuteNonQuery();
dbConnection.Close();
При использовании pgAdmin, чтобы вставить вышеуказанный оператор, он отлично работает. Используя драйвер NpgSQL через Visual Studio С#, он не справляется с этим исключением:
"ERROR: 22021: invalid byte sequence for encoding \"UTF8\": 0x81"
Как Milen точно объясняет, Postgres интерпретирует оператор как число octal
(\ o201 == 0x81).
Как Milen также описывает, что E
infront пути не помогает.
Итак, краткое описание: почему NpqSQL останавливает мою установку \\2010
?
Милен заслуживает доверия за то, что он привел меня к ответу - спасибо!
Внешний вид NpgSQL выполняет одну escape-итерацию перед вставкой моего SQL-запроса в Postgres. Таким образом, чтобы решить мою проблему, вместо этого я заменил все обратные косые черты двумя обратными косыми чертами:
string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";
(Реализованные мои комментарии выглядят как ответ, поэтому они соответствующим образом преобразуются.)
Вы не указали реальный код, поэтому я предполагаю, что ваш интерпретатор/компилятор интерпретирует двойную обратную косую черту как скрытую обратную косую черту, а затем Postgres видит только одну обратную косую черту, за которой следуют некоторые цифры. Который интерпретируется как восьмеричное значение байта (восьмеричное 201 = шестнадцатеричное число 81).
О строковых константах "escape" (строки, начинающиеся с "E" ) - в вашем случае они совершенно не нужны. В стандартном обратном слэсе SQL не имеет особого значения.
Пожалуйста, прочтите "4.1.2.1. Константы строк" и "4.1.2.2. Строковые константы с экранами стилей C" из руководства (http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS) для деталей.