2017-03-27 49 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問題的不同之處)。 –