我有一个搜索表单(使用方法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”的所有记录。也适用于数字也很完美。但如果用户键入希腊字符“φφφ”,我没有得到任何结果。并且有很多带有“φφφ”的记录。问题是希腊字符根本不被识别。
供您参考:
在具有相同SQL版本的本地PC中,我的代码正确识别希腊字符,因为我的区域设置是用希腊文设置的。但是美国托管服务器中的相同代码无法识别它们。
我的所有网页都有UTF-8编码。
有人有任何想法可以解决这个问题吗?
答案 0 :(得分:1)
SQL Server本身知道两种编码:
NVARCHAR
)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 '%φφφ%'