在SQL数据库中存储特殊字符

时间:2014-12-24 08:39:04

标签: c# sql asp.net sql-server

我正在使用SQL数据库开发ASP.NET C#Web应用程序。

我有一个“注意”列,我想存储例如文本“< test>”。 我在数据类型“Varchar”和“Text”上设置了列。

但HeidiSQL发布了一个错误。 (SQL Fehler(402):数据类型text和varchar在等于运算符中是不兼容的)

您是否知道如何存储此文字“< test>”在我的数据库?

我使用的陈述是:

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

2 个答案:

答案 0 :(得分:1)

您没有提到您正在使用的数据库,尽管问题出现在所有数据库中且解决方案是相同的。

  • 您应该始终在支持它们的数据库(如SQL Server,Oracle)中使用nvarchar等Unicode文本类型,或者对那些不熟悉的用户(如MySQL)使用UTF8排序规则。
  • 应使用参数化查询输入数据以避免编码转换错误
  • 如果绝对不可能使用参数化查询(无法想象为什么),您应该使用数据库的语法来传递Unicode值。在SQL Server中,这是通过在值之前添加N来完成的,例如N'my unicode text'

您还应该从不使用textntextvarchar(max)nvarchar(max)值,因为所有这些都是BLOB类型。它们用于存储大数据(最多2 GB),因此它们存储在普通表存储之外,从而导致大量性能命中。

<强>更新

我刚刚在评论中注意到,毕竟没有涉及特殊字符,只是字符串连接出错了。应该不惜一切代价避免字符串连接,因为:

  • 他们容易出错
  • 他们将您的代码暴露给SQL注入攻击(如果代替<text>某人输入moo');truncate table Notes;--,则显示图片)
  • 导致性能降低(服务器可以重用参数化查询的执行计划)
  • 难以编码和维护

为了避免将来出现此类错误,您应该使用参数化查询,这样您就可以传递任何值而无需转换,编码或格式化错误。实际的代码实际上更清晰,例如:

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();

如果您的字段实际上是blob,则可以使用SqlDbType.Text或SqlDbType.NText参数类型。

答案 1 :(得分:0)

如果您使用的是SQL SERVER,请使用'<test>'(单引号)。

另请查看Stackoverflow question