我們有一個奇怪的問題。我們正在升級JDE並且數據庫模式正在改變 - 一些char列正在改變爲nchar類型。但是,我們發現一些搜索不再有效,並且我們發現這在我們的SQL Server 2008數據庫中是一致的:SQL Server char和nchar列以不同的方式搜索
在我測試的數據庫中,ItemNumber列是char(25)並且具有不同的長度內容。
SELECT * FROM TableName WHERE ItemNumber LIKE '%S'
返回一堆行。但是,如果我們將列更改爲nchar(25),那麼查詢現在僅返回那些以「S」結尾的ItemNumber值爲和的行的長度爲25個字符,因此現在似乎尾隨空格(可能是正確的) - 如果將通配符值更改爲「%S」,則會查找以「S」結尾的24個字符的項目編號。
顯然,這對我們來說是一個相當大的問題,因爲* S搜索不再適用於JDE,因爲底層數據庫調用現在需要修改每個nchar列。這是一個已知的問題,還是一個我們需要改變的地方?
其他信息 我們沒有在使用的列類型的任何控制,也不是我們可以改變所產生的潛在的SQL,因爲這是我們的ERP系統及其升級的一部分。我們已經與甲骨文公司打過電話了,但據我所知,他們沒有看到這一點,也不能複製它(但我們不知道他們在什麼情況下試圖做到這一點),加上它的事實發生在我們其他的數據庫/服務器上,這讓我懷疑它是不是一個晦澀難懂的設置。
爲什麼使用char或nchar代替varchar或nvarchar?爲什麼 - 如果你已經將它更改爲Unicode - 你是不是正確地爲你的字符串加上前綴('WHERE ItemNumber LIKE N'%S';')? – 2013-04-23 13:57:44
我不會使用char或nchar,除非該字段被重用爲特定的長度(如2位數的statecodes)。否則,當需要使用varchar或nvarchar類型避免它們時,您將需要修剪哪些內容會浪費處理能力。這是一個設計更改,您不需要編碼更改。 – HLGEM 2013-04-23 14:09:38
請參閱上面我更新的附加信息 - 我們無法控制所使用的數據類型(事實上,我同意你的觀點並從未理解爲什麼將它們設置爲char)。再一次,就像你一樣,我在搜索時想到了N個前綴,但是: - a)這沒有什麼區別,b)我不認爲這個解決方案對我們有幫助,無論如何,因爲我們不能改變(AFAIK )基礎SQL生成。 – 2013-04-23 14:20:19