Вы не упоминаете, что базы данных вы используете, хотя проблема возникает во всех базах данных и решение такое же.
- Вы должны всегда использовать 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.
Это не может быть тип varchar AND типа текста - что это? Пожалуйста, разместите скрипт, который вы используете, чтобы вставить, и схему. P.S. Если SQL Server, текст типа данных обесценивается. – Bridge
*** Что такое *** база данных? SQL - это только язык запросов, используемый многими базами данных. Такие вещи очень специфичны для поставщиков и продуктов, поэтому, пожалуйста, добавьте соответствующий тег к вашему вопросу, чтобы это выяснить! –
Я имел в виду, что я пробовал и то, и другое ... тип данных "varchar" и "text" – user2959702