2010-08-26 37 views
1

我有一個使用MS SQL Server 2005作爲DBMS和jTDS作爲JDBC驅動程序的應用程序。所有存儲文本的列都是VARCHAR類型。爲驅動程序指定了一個sendStringParametersAsUnicode=false參數,以防止它將所有字符串作爲unicode發送(這會導致索引掃描,而不是索引列索引搜索,從而嚴重損害性能)。使用MS SQL Server和Hibernate處理NVARCHAR列

現在我需要在數據庫中存儲Unicode文本。我的問題是,如果我只是將列類型更改爲NVARCHAR,Hibernate仍然向數據庫發送非Unicode字符串(不帶N前綴),並且由於上述參數,驅動程序不會將其更改爲Unicode。顯而易見的解決方案是將所有文本列更改爲NVARCHAR並刪除參數。但是,我有近100個文本列,因此一次更改所有這些文本非常困難,我希望逐欄執行。另外,還有一些列理想情況下應該保留CHAR或VARCHAR,因爲不會寫入Unicode文本。

那麼,有沒有一種方法可以讓Hibernate發送具有N前綴的某些列的值,而不會影響仍在使用VARCHAR的其他列?據我的理解,這應該可以解決問題。或者,如果您可以建議其他方式來解決這個問題,它也將受到高度讚賞。

編輯:最後,我選擇將所有文本列更改爲NCHAR或NVARCHAR。有趣的是,數據庫的大小增長到原來大小的兩倍以上。我不知道這是怎麼可能的,但我想我必須忍受這一點。

+0

卡洛斯,這可能是壞的協議帶來了這樣一個古老的線程,但我我正在用一個使用java前端和休眠的UTF-8處理sql服務器。 DId所有你需要做的解決你的問題是改變列的類型?您是否需要如上所述更改驅動程序/驅動程序配置?感謝您的任何幫助 – akaphenom 2010-12-30 01:13:02

+0

@akaphenom我不得不刪除sendStringParametersAsUnicode參數,但僅此而已。 – Carlos 2010-12-30 17:21:04

回答

2

我可以回答這個問題的大小...

  • 爲nvarchar需要兩倍的空間爲varchar
  • 這也反映了任何索引太
  • 你適合每頁行數更少,減少了頁面的密度。

It all adds up.

我還考慮使用JTDS不MS JDBC ......這是更好的我想

+0

我想這可以解釋它,謝謝。但我一直在使用JTDS,就像我說的那樣。從未聽說過MS實施的任何好處。 – Carlos 2011-01-26 13:40:23