编码错误读取希腊字符字符串形式SQL数据库

时间:2017-03-27 14:18:49

标签: sql-server utf-8 character-encoding asp-classic

我有一个搜索表单(使用方法GET),只有一个名为“search_field”的文本字段。当用户提交表单时,用户字符键入的内容将发布到URL。例如,如果用户键入“blablabla”,则生成的URL将类似于:

results.asp?search_field=blablabla

在我的MSSQL 2012数据库中,我有一个名为“Products”的表,其中包含一个名为“kodikos”的列。

我想显示包含键入字符的“kodikos”列中的所有记录。我的SQL select语句如果如下:

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

(问号是“search_field”,其中包含用户字符输入的内容。

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

供您参考:

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

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

  3. 有人有任何想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

SQL Server本身知道两种编码:

  • 2字节unicode(大多数情况下为NVARCHAR
  • 与排序规则相关的扩展ASCII(在大多数情况下为VARCHAR

我认为,您所使用的语言是使用 2-byte-unicode 作为普通字符串。今天很常见......

我认为您的列Products.kodikos的类型为NVARCHAR 2-byte-unicode )。在这种情况下,它应该有助于强制您的搜索字符串 2-byte-unicode 。尝试

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

如果您的列不是 2字节编码,则可能有助于使用COLLATE强制您的搜索字符串知道您的特殊字符。

如果将此字符串传递给SQL-Server例程 as as is ,则应确保接受参数也是2字节unicode。

答案 1 :(得分:0)

您必须确保使用N''表示法对搜索字符串进行双字节编码...

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

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

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

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