2017-03-27 50 views
0

我有一个搜索窗体(与方法GET)只有一个名为“search_field”的文本字段。当用户提交表单时,用户字符输入的内容会发布到URL中。例如,如果用户键入“blablabla”生成的URL将是类似的东西:编码错误读取希腊字符字符串形式SQL数据库

results.asp?search_field=blablabla 

在我的MSSQL数据库2012我有一个表命名为“产品”有它命名为“kodikos”一栏。

我想显示包含输入字符的列“kodikos”中的所有记录。我的SQL SELECT语句,如果以下几点:

"SELECT * FROM dbo.Products WHERE dbo.Products.kodikos LIKE '%' + ? + '%' " 

(问号是“search_field”包含用户的字符输入

以上所有作品完美,我得到正确的结果。我面对的问题是希腊字符,例如,当用户键入“fff”我的代码完美并找到所有包含字符“fff”的记录时,也可以使用数字完美匹配,但如果用户输入希腊字符“φφφ”我没有得到任何结果,并且有很多“φφφ”的记录。问题是希腊字符根本不被识别。

为了您的信息:

  1. 在本地PC与相同版本的SQL希腊字符用我的代码正确识别的,因为我的区域设置在希腊设定。但是美国托管服务器中的相同代码无法识别它们。

  2. 我的所有页面都有UTF-8编码。

有人可以有任何想法来解决这个问题?

+2

这对于任何使用非西欧字符集与经典ASP。 https://www.hanselman.com/blog/InternationalizationAndClassicASP.aspx。注意,您是否使用参数化查询?如果你不是,那么你很容易受到SQL注入攻击。 – John

+0

在获得任何有意义的答案之前,您需要展示一些代码,在经典ASP代码中如何查询SQL Server? – Lankymart

+0

只说*“我的所有页面都有UTF-8编码”*是不够的,这并不意味着您不会有编码不匹配。 – Lankymart

回答

0

SQL Server知道两种编码本身:

  • 2字节的Unicode(在大多数情况下NVARCHAR
  • 与核对连接(在大多数情况下VARCHAR

扩展ASCII我假设,你调用这个语言的语言是使用2字节的unicode作为普通字符串。这是今天很平常......

我假设,你的列Products.kodikosNVARCHAR2字节unicode)类型。在这种情况下,它应该有助于强制您的搜索字符串也是2字节的统一代码。尝试

LIKE N'%' + CAST(? AS NVARCHAR(MAX)) + N'%' 

如果列不2字节编码它可能有助于利用COLLATE到您的搜索字符串强制知道你的特殊字符。

如果您将此字符串传递到SQL-Server例程原样,则应确保接受参数也是2字节的unicode。

+0

我试过你的代码,但不幸的是不工作。仅供参考数据类型是nvarchar(100) – user2986570

+0

@ user2986570 *不起作用*是什么意思?没有结果?错误?但是:由于列是'nvarchar(100)',所以您必须确保您的命令使用'N'literal''语法,您实际传递的字符串是* 2字节 - unicode *,并且所有变量/函数你可能会使用/调用之间应该是'NVARCHAR'太... – Shnugo

+0

不是一个错误。但不会返回结果。而且我知道有很多包含输入字符的记录。只是不承认希腊人.. – user2986570

0

你必须确保你的搜索字符串两个字节使用N''符号编码...

例如,下面的查询使用在两个字节编码的字符串:

SELECT * FROM dbo.Products WHERE dbo.Products.kodikos LIKE N'%φφφ%' 

但此查询使用不是两个字节编码的字符串(您不会得到任何结果):

SELECT * FROM dbo.Products WHERE dbo.Products.kodikos LIKE '%φφφ%' 
+0

这个问题将会是经典的ASP而不是SQL,当你跳跃出现多次被问及的明显的dup问题时,会发生这种情况。 – Lankymart

+0

@Lankymart,对我来说,这远离*显而易见的重复问题*,因为我缺乏'asp classic'。这些问题在T-SQL中也很常见...... Thx适合您的输入! – Shnugo

+0

这个问题实际上是两个部分。首先,在传统的ASP中,你必须向查询发送一个UTF-8字符串(这是你所讨论的重复部分)。其次,在SQL中,您必须以接受UTF-8字符串的方式构建查询(这是我的答案与dup问题的不同之处)。 –