2014-12-24 3 views
0

Я работаю над веб-приложением ASP.NET C# с базой данных SQL.хранить специальные символы в базе данных SQL

У меня есть столбец «Примечание», где я хочу хранить, например, текст «< test>». Я установил столбец в виде данных «Varchar» и «Text».

Но HeidiSQL выпустил ошибку. (SQL Fehler (402): текст типа данных и varchar несовместимы в равном оператору)

У вас есть идеи, как я могу сохранить этот текст "< test>" в моей базе данных?

заявление я использую:

var sql="INSERT INTO Notes (Note) VALUES ('" + txtNew.Text.Replace("'","''") + "'); 
+0

Это не может быть тип varchar AND типа текста - что это? Пожалуйста, разместите скрипт, который вы используете, чтобы вставить, и схему. P.S. Если SQL Server, текст типа данных обесценивается. – Bridge

+3

*** Что такое *** база данных? SQL - это только язык запросов, используемый многими базами данных. Такие вещи очень специфичны для поставщиков и продуктов, поэтому, пожалуйста, добавьте соответствующий тег к вашему вопросу, чтобы это выяснить! –

+0

Я имел в виду, что я пробовал и то, и другое ... тип данных "varchar" и "text" – user2959702

ответ

1

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

  • Вы должны всегда использовать Unicode типы текста, как nvarchar в базах данных, которые их поддерживают (например, SQL Server, Oracle), или использовать UTF8 параметры сортировки для тех, кто не (как MySQL).
  • Данные должны вводиться с использованием параметризованных запросов, чтобы избежать ошибок преобразования кодировки.
  • Если абсолютно невозможно использовать параметризованные запросы (не могу себе представить, почему), вы должны использовать синтаксис базы данных для передачи значений Unicode. В SQL Server это делается путем добавления N до значения, например N'my unicode text'

Вы должны также никогда использование text, ntext, varchar(max) или nvarchar(max) значения, как все эти типы BLOB. Они используются для хранения больших данных (до 2 ГБ), поэтому они хранятся вне обычного хранилища таблиц, что приводит к большим результатам производительности.

UPDATE

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

  • Они подвержены ошибкам
  • Они раскрывают свой код инъекциям SQL (изображение, если вместо <text> кто-то вошел moo');truncate table Notes;--)
  • Результат снижение производительности (сервер может повторно использовать планы выполнения параметризованных запросов)
  • уродлив закодировать и поддерживать

чтобы избежать подобных ошибок в грядущих событиях re вы должны использовать параметризованные запросы, которые позволяют передавать любое значение без ошибок преобразования, кодирования или форматирования.Реальный код на самом деле гораздо чище, например:

var myInsertCommand=new SqlCommand("INSERT into NOTES(Note) VALUES(@note)"); 
myInsertCommand.Parameters.Add("@note", SqlDbType.NVarChar,txtNew.Text.Length); 
myInsertCommand.Parameters["@note"].Value = txtNew.Text; 
myInsertCommand.ExecuteNonQuery(); 

Если поле фактически блоб вы можете использовать типы параметров SqlDbType.Text или SqlDbType.NText.

0

Если вы используете SQL Server, используйте '<test>' (в одиночных кавычках).

также посмотреть на Stackoverflow question

Смежные вопросы