深夜,朋友电话求助:网站的搜索出问题了!
朋友做了一个大型的音乐下载网站,很红火,其网站的核心代码是我写的,谁都知道asp的代码一般很稳定,如果不改动或者更换环境是不会出现什么问题的。可是这次的问题真的很怪,音乐按“标题”无法查询,但是按“歌星”,按“拼音”之类的都是正常的。比较了代码:"select * from yinyue where title Like '%"& keyword &"%' order by articleid desc",实在看不出什么毛病。不使用like,直接用=倒是可以,看来是模糊查询出错了。但是为什么会这样呢?
早上醒来,第一件事就是到google上搜索,运气还算不错,很快的就看到一篇标题为《Jet SQL 的 bug? 》blog,描述如下:
日前遇到一個有關Access的奇怪問題在這裡和各位討論一下,
在Access資料庫中若某欄位的資料含有某個日文字時就無法使用 like 條件而產生“Out of memory“的狀況
也就是當您有一筆資料含有該字元時無論條件是否符合都會導致錯誤發生, 我簡單提供一個範例並測試下面的例子:
1. select * from test (不使用條件的情況下正常)
2. select * from test where a like '%1%' (會產生錯誤“Out of memory“)
3. dataset + datatable.select (條件同第二點但分兩次處理)
不曉得這是不是 Jet 的bug? 我測試ADO OLEDB, ADO.NET OLEDB/ODBC, 三種方式例子2同樣都無法成功
相同資料內容與搜尋條件在SQLServer/MySQL則不會出現問題.
我目前的解決方法是採行DataSet並配合DataTable 的Select方法取代 where條件,
這麼雖然輸出無誤但效能相形之下卻變的較差, 不過這是我目前想到的唯一辦法,
各位若對此問題有興趣的話可以下載執行範例http://www.tiantian.cn/dotnet/test.zip(含source)
若您有更好的做法或解決方式歡迎來信討論...
因为朋友无意中咕哝了一句,是不是今天加了一千多首的日文歌曲的问题?呵呵,果真是小日本引起的BUG!
接下来就可以简单解决问题了,将代码更改为:
sql="select * from tablename"
rs.filter = " column like '%"&word&"%'"