隱藏在SQLServer字段中的超詭異字符該如何解決,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,正藍網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:正藍等地區(qū)。正藍做網(wǎng)站價格咨詢:13518219792
程序架構(gòu):B/S 開發(fā)環(huán)境:Windows XP + IIS6 + VS2003 數(shù) 據(jù) 庫:SQL Server 2000 部分功能:從 SQL Server 中導(dǎo)出數(shù)據(jù)到 Access。 這套系統(tǒng)做了大半年,這個導(dǎo)入導(dǎo)出還是問題不斷,我負責的這塊導(dǎo)入導(dǎo)出就是夾在網(wǎng) 絡(luò)版和單機版系統(tǒng)之間,只要任何一邊對數(shù)據(jù)庫做了改動這個導(dǎo)入導(dǎo)出就會失敗。哎,煩心 的事不止這些,最近又遇到了一個非常奇怪的問題。 由于之前的導(dǎo)入導(dǎo)出使用SQL Server 支持的OpenDataSource()函數(shù)來做,而當遇到 64位系統(tǒng)時就會遇到不支持Microsoft.Jet.OLEDB.4.0 ,所以重新編碼,技術(shù)步驟是先從SQL Server 讀數(shù)據(jù)到DataTable,然后遍歷這個DataTable,對每一行,將里面的數(shù)據(jù)重新組合成一條Insert 語句,然后打開Access文件鏈接,執(zhí)行剛才生成的Insert語句,將數(shù)據(jù)插入到Access中。 我最終提交給Access執(zhí)行的語句是根據(jù)SQL Server中的數(shù)據(jù)拼出來,比如SQL Server :select a, b, c from tblTemp 提交給Access執(zhí)行的語句就是:復(fù)制代碼 代碼如下: Str1 = “Insert into” Str2 = “tblTemp(a,b,c)values(” strResult = str1 & str2 & “‘a(chǎn)a', 2, ‘cc' ” & “)”
這回的重大問題是在SQL Server 表的b字段中有特殊字符,此字符使我的程序無法拼出完整的字符串,拼出來的字符串strResult 有時不帶最后的“)”,但奇怪的是,這個表總共有4萬多條記錄,只是組合個別記錄才會出現(xiàn)這個現(xiàn)象。但是提交給Access執(zhí)行肯定不通過,提示SQL語法錯誤。 我于是查詢數(shù)據(jù)庫的這條記錄,用查詢分析器查詢沒發(fā)現(xiàn)任何的特殊字符,問了同事后才知道,他說之前有過部分表中的某些字符保存了客戶輸入的回車換行符,我頓時大悟,對呀,回車換行符是看不見的啊,于是,想使用下面的語句查詢字段中是否有回車換行符:復(fù)制代碼 代碼如下: select charindex(char(10), demc) from tblgc_jc_de where xh = 15641 select charindex(char(13), demc) from tblgc_jc_de where xh = 15641 select charindex(char(10) + char(13), demc) from tblgc_jc_de where xh = 15641 select charindex(char(13) + char(10), demc) from tblgc_jc_de where xh = 15641
但奇怪的是,返回都是0,也就是找不到。這就郁悶了,字段中到底存儲了什么字符啊?,另一個同事教了一招,直接在企業(yè)管理器中返回該表的所有行記錄,然后全選查看該字段,發(fā)現(xiàn)確實是多出一個字符: 不是回車換行符會是什么字符呢?在百思不解之際,突然想起,不如看看這個表物理數(shù)據(jù),一定能查出存儲在該字段的是什么字符。但是該表有44022條記錄,查某一條記錄的物理數(shù)據(jù)就是大海撈針,怎么辦??? 我只想查詢這條記錄的物理數(shù)據(jù)要怎么做?能不能把這條數(shù)據(jù)放到另一個表中,這個表只有這一條記錄,這不就可以查看了嗎。哦,這個簡單,其實我同時建立了一個臨時的數(shù)據(jù)庫,這個數(shù)據(jù)庫只有一張表,這張表只有一條記錄,就是包含上面那個有問題的記錄,使用的SQL語句如下: -- TYZW 是正式庫 use TYZW -- 創(chuàng)建一個臨時數(shù)據(jù)庫,然后將有問題的那條 -- 記錄插入臨時庫。 create database tmpTYZW go select * into tmpTYZW..tblgc_jc_de from tblgc_jc_de where xh = 15641 go 現(xiàn)在是時候查看一下這條記錄的物理數(shù)據(jù)了,首先要在sysindexes系統(tǒng)表中查找出該表在物理文件中的位置,然后我們可以通過 dbcc page 命令查看物理數(shù)據(jù):接著使用dbcc page命令查看物理數(shù)據(jù):
現(xiàn)在是時候看看這條記錄的物理數(shù)據(jù)了:
天啊,竟然是0,真不曉得是怎么存進去的。問題終于知道在那了,但是要如何解決呢?最簡單的方法就是將這個0替換掉,于是使用下列語句測試:
select replace(demc, char(0), '') as demc from tblgc_jc_de
但是不行,原因是replace函數(shù)找不到0這個字符,因為它查找是按兩個字節(jié)來找的,所以直接在SQL Server上找也找不到這個字符,替換也替換不了。但是,我又想了一下,能不能使用二進制來查找和替換?看了一下資料,使用下面的SQL語句能找出0在該字段的位置:
查是能查出來了,但是我發(fā)現(xiàn)replace函數(shù)還是不能用,除非是替換4位,也就是0x0038。
最后實在無奈,只能直接把有這個特殊字符的地段截掉一個文字,也就是連那個38也不要了:
select
case when charindex(convert(varbinary(1),0x00),convert(varbinary(200),demc)) > 0
then substring(demc,1,len(demc)-1)
else demc
end as DEMC
from tblgc_jc_de
這就是我現(xiàn)在用的最終解決方案,因為我查詢過,4萬多條記錄中只有8條有這個0在字段里面。所以就算截掉一個文字并影響程序的功能和顯示。
看完上述內(nèi)容,你們掌握隱藏在SQLServer字段中的超詭異字符該如何解決的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
本文標題:隱藏在SQLServer字段中的超詭異字符該如何解決
網(wǎng)頁地址:http://newbst.com/article34/jhsppe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、App設(shè)計、ChatGPT、App開發(fā)、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)