人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

隱藏在SQLServer 字段中的超詭異字符解決過(guò)程

發(fā)布日期:2022-01-31 09:04 | 文章來(lái)源:gibhub

文章作者:jhkdiy
發(fā)表日期:2009-10-11
程序架構(gòu):B/S
開(kāi)發(fā)環(huán)境:Windows XP + IIS6 + VS2003
數(shù) 據(jù) 庫(kù):SQL Server 2000
部分功能:從 SQL Server 中導(dǎo)出數(shù)據(jù)到 Access。
這套系統(tǒng)做了大半年,這個(gè)導(dǎo)入導(dǎo)出還是問(wèn)題不斷,我負(fù)責(zé)的這塊導(dǎo)入導(dǎo)出就是夾在網(wǎng)
絡(luò)版和單機(jī)版系統(tǒng)之間,只要任何一邊對(duì)數(shù)據(jù)庫(kù)做了改動(dòng)這個(gè)導(dǎo)入導(dǎo)出就會(huì)失敗。哎,煩心
的事不止這些,最近又遇到了一個(gè)非常奇怪的問(wèn)題。
由于之前的導(dǎo)入導(dǎo)出使用SQL Server 支持的OpenDataSource()函數(shù)來(lái)做,而當(dāng)遇到
64位系統(tǒng)時(shí)就會(huì)遇到不支持Microsoft.Jet.OLEDB.4.0 ,所以重新編碼,技術(shù)步驟是先從SQL Server 讀數(shù)據(jù)到DataTable,然后遍歷這個(gè)DataTable,對(duì)每一行,將里面的數(shù)據(jù)重新組合成一條Insert 語(yǔ)句,然后打開(kāi)Access文件鏈接,執(zhí)行剛才生成的Insert語(yǔ)句,將數(shù)據(jù)插入到Access中。
我最終提交給Access執(zhí)行的語(yǔ)句是根據(jù)SQL Server中的數(shù)據(jù)拼出來(lái),比如SQL Server :select a, b, c from tblTemp
提交給Access執(zhí)行的語(yǔ)句就是:

復(fù)制代碼 代碼如下:

Str1 = “Insert into”
Str2 = “tblTemp(a,b,c)values(”
strResult = str1 & str2 & “‘a(chǎn)a', 2, ‘cc' ” & “)”

這回的重大問(wèn)題是在SQL Server 表的b字段中有特殊字符,此字符使我的程序無(wú)法拼出完整的字符串,拼出來(lái)的字符串strResult 有時(shí)不帶最后的“)”,但奇怪的是,這個(gè)表總共有4萬(wàn)多條記錄,只是組合個(gè)別記錄才會(huì)出現(xiàn)這個(gè)現(xiàn)象。但是提交給Access執(zhí)行肯定不通過(guò),提示SQL語(yǔ)法錯(cuò)誤。
我于是查詢(xún)數(shù)據(jù)庫(kù)的這條記錄,用查詢(xún)分析器查詢(xún)沒(méi)發(fā)現(xiàn)任何的特殊字符,問(wèn)了同事后才知道,他說(shuō)之前有過(guò)部分表中的某些字符保存了客戶(hù)輸入的回車(chē)換行符,我頓時(shí)大悟,對(duì)呀,回車(chē)換行符是看不見(jiàn)的啊,于是,想使用下面的語(yǔ)句查詢(xún)字段中是否有回車(chē)換行符:
復(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,也就是找不到。這就郁悶了,字段中到底存儲(chǔ)了什么字符啊?,另一個(gè)同事教了一招,直接在企業(yè)管理器中返回該表的所有行記錄,然后全選查看該字段,發(fā)現(xiàn)確實(shí)是多出一個(gè)字符:
查到有個(gè)看不見(jiàn)的字符
不是回車(chē)換行符會(huì)是什么字符呢?在百思不解之際,突然想起,不如看看這個(gè)表物理數(shù)據(jù),一定能查出存儲(chǔ)在該字段的是什么字符。但是該表有44022條記錄,查某一條記錄的物理數(shù)據(jù)就是大海撈針,怎么辦???
我只想查詢(xún)這條記錄的物理數(shù)據(jù)要怎么做?能不能把這條數(shù)據(jù)放到另一個(gè)表中,這個(gè)表只有這一條記錄,這不就可以查看了嗎。哦,這個(gè)簡(jiǎn)單,其實(shí)我同時(shí)建立了一個(gè)臨時(shí)的數(shù)據(jù)庫(kù),這個(gè)數(shù)據(jù)庫(kù)只有一張表,這張表只有一條記錄,就是包含上面那個(gè)有問(wèn)題的記錄,使用的SQL語(yǔ)句如下:
-- TYZW 是正式庫(kù)
use TYZW
-- 創(chuàng)建一個(gè)臨時(shí)數(shù)據(jù)庫(kù),然后將有問(wèn)題的那條
-- 記錄插入臨時(shí)庫(kù)。
create database tmpTYZW
go
select * into tmpTYZW..tblgc_jc_de from tblgc_jc_de where xh = 15641
go
現(xiàn)在是時(shí)候查看一下這條記錄的物理數(shù)據(jù)了,首先要在sysindexes系統(tǒng)表中查找出該表在物理文件中的位置,然后我們可以通過(guò) dbcc page 命令查看物理數(shù)據(jù):
查看表記錄在文件中的位置
接著使用dbcc page命令查看物理數(shù)據(jù):
查看物理數(shù)據(jù)


現(xiàn)在是時(shí)候看看這條記錄的物理數(shù)據(jù)了:

物理數(shù)據(jù)


天啊,竟然是0,真不曉得是怎么存進(jìn)去的。問(wèn)題終于知道在那了,但是要如何解決呢?最簡(jiǎn)單的方法就是將這個(gè)0替換掉,于是使用下列語(yǔ)句測(cè)試:

select replace(demc, char(0), '') as demc from tblgc_jc_de

但是不行,原因是replace函數(shù)找不到0這個(gè)字符,因?yàn)樗檎沂前磧蓚€(gè)字節(jié)來(lái)找的,所以直接在SQL Server上找也找不到這個(gè)字符,替換也替換不了。但是,我又想了一下,能不能使用二進(jìn)制來(lái)查找和替換?看了一下資料,使用下面的SQL語(yǔ)句能找出0在該字段的位置:

二進(jìn)制方式查詢(xún)字符位置查是能查出來(lái)了,但是我發(fā)現(xiàn)replace函數(shù)還是不能用,除非是替換4位,也就是0x0038。

最后實(shí)在無(wú)奈,只能直接把有這個(gè)特殊字符的地段截掉一個(gè)文字,也就是連那個(gè)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)在用的最終解決方案,因?yàn)槲也樵?xún)過(guò),4萬(wàn)多條記錄中只有8條有這個(gè)0在字段里面。所以就算截掉一個(gè)文字并影響程序的功能和顯示。

雖然我現(xiàn)在寫(xiě)出來(lái)很多步驟看似走的很順,其實(shí)這個(gè)問(wèn)題我用了幾天時(shí)間了,主要是找問(wèn)題所在耗費(fèi)了不少時(shí)間?,F(xiàn)在給出此文希望廣大朋友在找這些問(wèn)題時(shí)多個(gè)方向,因?yàn)榇鎯?chǔ)在字段中的特殊字符不一定就是常規(guī)的回車(chē)換行符,也有可能是其它字符,在此大家互相學(xué)習(xí)提高吧。

美國(guó)服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線(xiàn)路精選!

全天候客戶(hù)服務(wù)

7x24全年不間斷在線(xiàn)

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶(hù)咨詢(xún)顧問(wèn)

在線(xiàn)
客服

在線(xiàn)客服:7*24小時(shí)在線(xiàn)

客服
熱線(xiàn)

400-630-3752
7*24小時(shí)客服服務(wù)熱線(xiàn)

關(guān)注
微信

關(guān)注官方微信
頂部