varchar轉換為binary后再轉換回來為什么就不一樣了??


declare @ varchar(100),@s varchar(100)
select @='char_Bin'
select @,len(@),'***'+@+'***',len('***'+@+'***')
select @s=cast(cast(@ as binary(100)) as varchar(100))

--大家看一下結果:為什么'***'+@s+'***'的顯示結果后三個星號沒了呢????

select @s,len(@s),'***'+@s+'***',len('***'+@s+'***')

82 个解决方案

#1


200分?..可以接點分再看嗎?

#2


cast(@ as binary(100))
這里就變成了char_Bin
不明白原因,看高人解答

#3


佩服小梁,當然會給你分,哈哈

#4


binary(100)

-->>
varbinary(100)

#5


sql聯機文檔里面的說明:
當從一個 SQL Server 對象的數據類型向另一個轉換時,一些隱性和顯式數據類型轉換是不支持的。例如,nchar 數值根本就不能被轉換成 image 數值。nchar 只能顯式地轉換成 binary,隱性地轉換到 binary 是不支持的。nchar 可以顯式地或者隱性地轉換成 nvarchar。

#6


declare @ varchar(100),@s varchar(100)
select @='char_Bin'
select @,len(@),'***'+@+'***',len('***'+@+'***')

select @s=cast(cast('***'+@+'***' as binary(100)) as varchar(100))

#7


引用 5 樓 dsk22657 的回復:
sql聯機文檔里面的說明: 
當從一個 SQL Server 對象的數據類型向另一個轉換時,一些隱性和顯式數據類型轉換是不支持的。例如,nchar 數值根本就不能被轉換成 image 數值。nchar 只能顯式地轉換成 binary,隱性地轉換到 binary 是不支持的。nchar 可以顯式地或者隱性地轉換成 nvarchar。

#8



回復:roy_88 

declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 

select @s=cast(cast('***'+@+'***' as binary(100)) as varchar(100))

select @s+'abcd'

#9


在加字符時轉換
固定長度或可變長度的二進位資料類型。 

binary [ ( n ) ] 

固定長度的二進位資料,其長度為 n 位元組,n 代表 1 到 8,000 的值。儲存體大小是 n 位元組。

varbinary [ ( n | max) ] 

可變長度的二進位資料。n 是 1 到 8,000 的值。max 表示儲存體大小上限是 2^31-1 位元組。儲存體大小是輸入資料的實際長度再加上 2 位元組。輸入的資料有可能是 0 位元組。varbinary 的 SQL-2003 同義字是 binary varying。

#10


是char時用binary
varchar用可變長度varbinary

#11




declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast(@ as varbinary(100)) as varchar(100)) 
select @s,len(@s),'***'+@s+'***',len('***'+@s+'***') 

#12


declare @ varchar(100),@s varchar(100),@s2 varchar(100)

select @='char_Bin'

select @,len(@),'***'+@+'***',len('***'+@+'***')


select @s=cast(cast(@ as binary(100)) as varchar(100))

select @s2=cast(cast(@ as varbinary(100)) as varchar(100))

select @s,len(@s),'***'+@s+'***',len('***'+@s+'***')

--轉為varbinary再轉換回來就沒有任何問題,但轉為binary再轉換回來就有問題

select @s2,len(@s2),'***'+@s2+'***',len('***'+@s2+'***')

#13


char對應binary

varchar對應varbinary


declare @s char(100)
set @s='EE'
select '***'+ cast(cast(@s as binary(100)) as char(100)) + '***'
/*
***EE                                                                                                  ***
*/
declare @s varchar(100)
set @s='EE'
select '**'+ cast(cast(@s as varbinary(100)) as varchar(100)) + '**'
/*
**EE**
*/

#14


declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
--select 
--@,
--len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(
cast(@ as binary(100)) -- 轉換成這個的時候, 結果的長度是 100 了(尾部用 0x00 填充)
as varchar(100))       -- 再轉換回 varchar 的時候, 尾部填充的 0x00 也不會消失

select @s,len(@s),
'***'+@s+'***',  -- 在顯示字符串的時候, 遇到編碼 0x00 的時候會中斷后面的顯示, 故 @s 后面的數據是有, 但顯示不出來
len('***'+@s+'***') 
select CAST('a' as BINARY(10))

#15


所以不是數據丟失了
而樓主所謂的轉換不過來, 是因為 sql 的定長類型(char/nchar/binay), 如果賦的值不足定義的長度, 會自動在后面填充數據以達到指定的長度
既然填充了數據, 所以轉換回去的時候結果當然不一樣了

#16


謝謝鄒建,
還想問一下
select @s,len(@s),
    '***'+@s+'***',  -- 在顯示字符串的時候, 遇到編碼 0x00 的時候會中斷后面的顯示, 故 @s 后面的數據是有, 但顯示不出來


這時
如何處理才能顯示出來??

#17


看鑽石

#18


去掉那些特殊字符, 或者自己寫個支持特殊字符顯示的程序

#19



老大出面了
跟隨下

#20


或者直接轉換籽varbinary 顯示

#21


搬個板凳看看老大。。。。


#22


如何去掉那些特殊字符, 或者自己寫個支持特殊字符顯示的程序

請老大寫個范例吧,謝謝!!

#23


看老大上課來了

#24


http://www.sqlscripter.com/
SQL Scripter 的Generate T-SQL Data Scripts功能可以導出這種情況下的@s
不知道他們是怎么做的

#25


或者說如何判斷字符串@s包含特殊字符??

#26


只有 0x00 會截斷, 所以將它替換掉就好了

看下面的測試, 下面的測試把 ascii 碼都測試了一次, 只有第一個會顯示不全, 而且使用了 REPLACE 后, 顯示就正常了(當然那個 0x00 也就沒啦)
;WITH
ID AS(
SELECT TOP(256)
id = CONVERT(varbinary(1), ROW_NUMBER() OVER(ORDER BY O.object_id) - 1)
FROM sys.objects O, sys.columns C
)
SELECT
ID,
'a' + CONVERT(varchar, id) + 'b',
REPLACE('a' + CONVERT(varchar, id) + 'b', 0x00, 0x20)
FROM ID

#27


判斷使用類似這樣的語句

WHERE CHARINDEX(0x00, CONVERT(varbinary(8000), 要判斷的數據)) > 0

#28


引用 24 樓 prcgolf 的回復:
http://www.sqlscripter.com/ 
SQL Scripter 的Generate T-SQL Data Scripts功能可以導出這種情況下的@s 
不知道他們是怎么做的 


測試過嗎? 如果用字符的話, 我嘗試寫成 T-SQL 腳本文件, 打開也是有問題的, 當然用二進制就不太一樣了

#29


好哎,明白了  

#30




判斷使用類似這樣的語句 


SQL code WHERE CHARINDEX(0x00, CONVERT(varbinary(8000), 要判斷的數據)) > 0

#31


declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 

--大家看一下結果:為什么'***'+@s+'***'的顯示結果后三個星號沒了呢???? 

select @s,len(@s),'***'+@s+'***',len('***'+@s+'***') 

/*

------------  ----------- ---------------------------------------------------------------------------------------------------------- ----------- 
char_Bin       100         ***char_Bin                                                                                            *** 106

(所影響的行數為 1 行)
*/

#32


.

#33


 


declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast('***'+@+'***' as binary(100)) as varchar(100)) 
select @s

***char_Bin***




各位都在討論什么呢??不明白了。


declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 
select '***'+@s+'***'


***char_Bin





哦,這樣才出來后面沒有字符,明白了。!

#34


學習....

不是很明白..

#35


select @s,len(@s),
    '***'+@s+'***',  -- 在顯示字符串的時候, 遇到編碼 0x00 的時候會中斷后面的顯示, 故 @s 后面的數據是有, 但顯示不出來
    len('***'+@s+'***') 
select CAST('a' as BINARY(10))

select @s,len(@s),'***'+@s+'***',len('***'+@s+'***') 
char_Bin 100 ***char_Bin 106

select @s=cast(cast(@ as binary(100)) as varchar(100)) ---@s的長度變為100
從結果中就可以看到字符串的長度為106,為@s的長度加上兩個***的長度

#36


to:
happyflystone

你是怎么顯示出來的,我用sql2005 SSMS 顯示不出來最后的三顆星啊

#37


引用 5 樓 dsk22657 的回復:
sql聯機文檔里面的說明: 
當從一個 SQL Server 對象的數據類型向另一個轉換時,一些隱性和顯式數據類型轉換是不支持的。例如,nchar 數值根本就不能被轉換成 image 數值。nchar 只能顯式地轉換成 binary,隱性地轉換到 binary 是不支持的。nchar 可以顯式地或者隱性地轉換成 nvarchar。

#38


引用樓主 prcgolf 的帖子:
declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 

--大家看一下結果:為什么'***'+@s+'***' 的顯示結果后三個星號沒了呢???? 

select @s,len(@s),'***'+@s+'***',len('***'+@s+'***') 


有啊,怎么沒了???

---------------------------------------------------------------------------------------------------- ----------- ---------------------------------------------------------------------------------------------------------- -----------
char_Bin                                                                                             100         ***char_Bin                                                                                             *** 106

(1 row(s) affected)

#39


引用 16 樓 prcgolf 的回復:
謝謝鄒建, 
還想問一下 
select @s,len(@s), 
    '***'+@s+'***',  -- 在顯示字符串的時候, 遇到編碼 0x00 的時候會中斷后面的顯示, 故 @s 后面的數據是有, 但顯示不出來 


這時 
如何處理才能顯示出來?? 


我用的SQL2005,顯示正常~~~

#40


to: 
do熊 

你是怎么顯示出來的,我用sql2005 SSMS 顯示不出來最后的三顆星啊 

#41


引用 40 樓 prcgolf 的回復:
to: 
do熊 

你是怎么顯示出來的,我用sql2005 SSMS 顯示不出來最后的三顆星啊 


--你這樣試試:
declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 

--大家看一下結果:為什么'***'+@s+'***'的顯示結果后三個星號沒了呢???? 

--select @s,len(@s),'***'+@s+'***',len('***'+@s+'***') 
select right('***'+@s+'***', 10)

#42


我也有啊?

declare @ varchar(100),@s varchar(100)
select @='char_Bin'
select @,len(@),'***'+@+'***',len('***'+@+'***')
select @s=cast(cast(@ as binary(100)) as varchar(100))
print @s

結果:
                                                                                                                                                                                                                                    ---------- ----------- ------------------- ----------- 
char_Bin    8           ***char_Bin***     14

(所影響的行數為 1 行)

char_Bin

#43


你這樣試試:
declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @,len(@),'***'+@+'***',len('***'+@+'***') 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 

--大家看一下結果:為什么'***'+@s+'***'的顯示結果后三個星號沒了呢???? 

--select @s,len(@s),'***'+@s+'***',len('***'+@s+'***') 
select right('***'+@s+'***', 10)


仍然是空

我的版本號:
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86)   Feb  9 2007 22:47:07   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 

#44


;WITH
ID AS(
    SELECT TOP(256)
        id = CONVERT(varbinary(1), ROW_NUMBER() OVER(ORDER BY O.object_id) - 1)
    FROM sys.objects O, sys.columns C
)
SELECT
    ID,
    'a' + CONVERT(varchar, id) + 'b',
    REPLACE('a' + CONVERT(varchar, id) + 'b', 0x00, 0x20)
FROM ID

 為什么我替換了之后還是不顯示?

#45


很奇怪,但這樣可以。
declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 
select replace(@s+'-','-','***')
--char_Bin***

#46


很奇怪,但這樣可以。 

SQL codedeclare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 
select replace(@s+'-','-','***')
--char_Bin***


我的這樣也不能顯示

#47


這樣可以了,中英文都行。
declare @ varchar(100),@s varchar(100) 
select @='cha所附撒r_Bin' 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 
select @s = left(@s,charindex(0x00,cast(@s as varbinary))-1)
select @s = @s +'----'
select @s
--cha所附撒r_Bin

#48


declare @ varchar(100),@s varchar(100) 
select @='char_Bin' 
select @s=cast(cast(@ as binary(100)) as varchar(100)) 
select @s = left(@s,charindex(0x00,cast(@s as varbinary))-1)
select @s = @s +'----'
select @s
--char_Bin----

#49


to :Herb2

中文的不行啊

#50


引用 49 樓 prcgolf 的回復:
to :Herb2 

中文的不行啊

英文的可以,中文的不行。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com