转义SQL2005/2008中的双引号我最近加入了一家名为“BLA”BLAHBLAH”Ltd.的国际公司(双引号是名称的一部分。)每当用户尝试通过键入“Blah或其他任何内容来搜索这家公司时,搜索都会因SQLServer中的语法错误而失败。我如何避免这种情况以便搜索不会失败?示例SQL:SELECTc.companyID、c.companyName、c.dateAdded、count(cm.maxID)asNumDirectFROMRussoundGeneral.dbo.CompanycLEFTJOINRussoundGeneral.dbo.CompanyMaxcmON(cm.companyId=c.companyIdandcm.maxID不为空)WHERECONTAINS(companyName,'"BLAH*')GROUPBYc.companyID,c.companyName,c.dateAddedORDERBYc.companyNameASC不幸的是双引号在FTI中有特殊含义,所以即使你参数化它,FTI引擎会将其视为短语定界符。我不确定是否有一种简单的方法可以在FTI搜索中包含双引号。括号也是一个特殊字符,但可以用引号括起来作为查询词-但不是双引号AFAIK。更新一些搜索表明,将“”周围的引号加倍可能会解决它-值得一试。就个人而言,我会在数据库中执行此操作,因为这是一个TSQL实现细节。此外,'需要加倍'在传递给FTI(完全独立于TSQL转义)之前,使用参数化查询,所有引用的问题都会消失。编辑:如果您不希望他们在CONTAINS中输入多个单词,请通过删除引号来清理参数。不管多词搜索如何,通过删除引号来清理输入可能仍然有效。我强烈怀疑您正在动态构建SQL-例如//错误代码,请勿使用!stringsql="SELECT*FROMFROMWHEREXLIKE'"+input+"%'";这是一个非常非常糟糕的主意——尤其是SQL注入攻击。相反,使用参数化SQL语句,单独指定参数。有关如何正确执行此操作的示例,请查看标有sql-injection的各种问题的答案。这是一个理论上的答案,但也许会有所帮助。简短的版本是“在查询中使用参数”,但它有助于理解完整的细节。在标准SQL中,字符串用单引号括起来,嵌入的单引号由一行中的两个单引号表示:SELECT*FROMSomeWhereWHERESomeThing='Hesaid,"Don'tdoit!"';在SQL的某些方言中,您可以用双引号关闭字符串;那么您需要将双引号加倍以嵌入单个双引号实例:SELECT*FROMSomeWhereWHERESomeThing="Hesaid,""Don'tdoit!""';从问题中不清楚公司名称是否包括中间名和外部双引号,或者是否只包括中间名。但原则上规则是相同的。假设需要所有三个双引号,并在SQL中使用单引号-在这种情况下更容易:SELECTc.companyID,c.companyName,c.dateAdded,count(cm.maxID)asNumDirectFROMRussoundGeneral.dbo.CompanycLEFTJOINRussoundGeneral.dbo.CompanyMaxcmON(cm.companyId=c.companyIdandcm.maxIDisnotnull)WHERECONTAINS(companyName,'"BLAH"BLAHBLAH"Ltd.')GROUPBYc.companyID,c.companyName,c.dateAddedORDERBYc.companyNameASC;使用双引号:SELECTc.companyID,c.companyName,c.dateAdded,count(cm.maxID)asNumDirectFROMRussoundGeneral.dbo.CompanycLEFTJOINRussoundGeneral.dbo.CompanyMaxcmON(cm.companyId=c.companyIdandcm.maxIDisnotnull)WHERECONTAINS(companyName,"""BLAH""BLAHBLAH""Ltd.")GROUPBYc.companyID,c.companyName,c.dateAddedORDERBYc。companyNameASC;如果您正在用一种编程语言构建字符串,那么您必须担心那些引号会从您的编程语言中的字符串中消失。例如,如果您在C中构建字符串文字,则必须使用反斜杠对双引号进行转义:staticconstcharsql_stmt[]="SELECTc.companyID,c.companyName,c.dateAdded,n""COUNT(cm.maxID)ASNumDirectn""FROMRussoundGeneral.dbo.Companycn""LEFTJOINRussoundGeneral.dbo.CompanyMaxcmn""ON(cm.companyId=c.companyIdANDcm.maxIDISNOTNULL)n""WHERECONTAINS(companyName,"""BLAH""BLAHBLAH""Ltd.")n""GROUPBYc.companyID,c.companyName,c.dateAddedn""ORDERBYc.companyNameASC";另一方面,如果你从用户那里读取数据——比如公司名称,那么你只需要确保你读取的内容被正确引用。那些说“使用参数”的人是对的——它更容易、更可靠,并且更不容易受到SQL注入攻击(如果您还没有看到它,请参阅XKCD)。但是,如果您了解基础知识,就可以适应系统的实际要求。最后说明:在标准SQL中,双引号将“定界标识符”括起来。也就是说,双引号括起的名称必须被视为数据库中某物的名称,而不是字符串文字。在MSSQLServer中,[方括号]用于相同的目的;括号之间是列的名称或数据库中的任何内容。许多系统比这更灵活;并非所有系统在偏离标准方面都是平等的。您是否尝试过用ASCII码替换字符?尝试使用转义关键字:SELECTc.companyID,c.companyName,c.dateAdded,count(cm.maxID)asNumDirectFROMRussoundGeneral.dbo.CompanycLEFTJOINRussoundGeneral.dbo.CompanyMaxcmON(cm.companyId=c.companyIdandcm.maxIDisnotnull)WHERECONTAINS(companyName,'"BLAH*')escape''groupbyc.companyID,c.companyName,c.dateAddedORDERBYc.companyNameASC应该像这个字符串sqlCommand="SELECTc.companyID,c.companyName,c.dateAdded,count(cm.maxID)asNumDirectFROMRussoundGeneral.dbo.CompanycLEFTJOINRussoundGeneral.dbo.CompanyMaxcmON(cm.companyId=c.companyId和cm.maxID是notnull)WHERECONTAINS(companyName,'@strVal')groupbyc.companyID,c.companyName,c.dateAddedORDERBYc.companyNameASC"SqlCommandcommand=newSqlCommand(strSQLCommand,conn);SqlCommand.Parameters.AddWithValue("@strval",SearchTextBox.Text);您最终将不得不从数据库中提取数据并将其显示在屏幕上或打印在报告上。处理双引号或任何额外的字符会让人非常困惑。通过在插入或更新之前将字符串转换为HTML,您可以避免与引用管理相关的所有混淆。选择时很容易从HTML转换回来。在报告时(因为CrystalReports等报告工具提供了HTML格式化选项),您甚至不需要做任何事情来以正确的方式显示数据。顺便说一下,不要忘记抓住发明这个公司名称的人。以上就是C#学习教程:EscapingdoublequotesinSQL2005/2008的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
