【问题标题】:Encoding error reading Greek characters string form SQL database从 SQL 数据库读取希腊字符串的编码错误
【发布时间】:2017-03-28 04:18:50
【问题描述】:

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

results.asp?search_field=blablabla

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

我想显示包含输入字符的“kodikos”列中的所有记录。我的 SQL 选择语句 if 如下:

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

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

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

供您参考:

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

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

有人可以解决这个问题吗???

【问题讨论】:

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


【解决方案1】:

SQL Server 本身就知道两种编码:

  • 2-byte-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 例程原样,您应该确保接受参数也是 2 字节 unicode。

【讨论】:

  • 我试过你的代码,但很遗憾没有用。仅供参考,数据类型是 nvarchar(100)
  • @user2986570 不起作用是什么意思?没有结果?错误?但是:由于列是 nvarchar(100),您必须确保您的命令使用 N'literal' 语法,您传递的字符串实际上是 2-byte-unicode 并且所有变量/函数都是您可能使用/调用之间也应该是NVARCHAR...
  • 不是错误。但一直不返回结果。而且我知道有很多包含输入字符的记录。只是一直不承认希腊人..
  • @user2986570 您是否尝试使用 Profiler 来监控到达服务器的查询?检查,什么是进来的,什么是出来的。你应该 - 有很多原因! - 首选类型参数!
  • 您能否提供正确的语法来尝试 COLLATE 方法?希腊语排序规则是 Greek_CI_AS
【解决方案2】:

您必须确保您的搜索字符串是使用N'' 表示法编码的两个字节...

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

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

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

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

【讨论】:

  • 问题将是经典 ASP 而不是 SQL,当您跳入已被多次询问的明显重复问题时会发生这种情况。
  • @Lankymart,对我来说,由于我没有asp classic,这与一个明显的重复问题相去甚远。此类问题在 T-SQL 中也很常见...谢谢您的意见!
  • 这个问题实际上是两个部分。首先,在 Classic ASP 中,您必须向查询发送一个 UTF-8 字符串(这是您谈到的重复部分)。其次,在 SQL 中,您必须以接受 UTF-8 字符串的方式构建查询(这就是我的答案与 dup 问题的不同之处)。
  • @bastos.sergio 对于初学者来说,他们应该使用参数化查询甚至存储过程,那么这只是定义adVarWChar 参数和N' 的情况,不需要担心。
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多