varbinary เป็นสตริงบน SQL Server


96

วิธีการแปลงค่าคอลัมน์จากvarbinary(max)เป็นvarcharในรูปแบบที่มนุษย์อ่านได้?


3
ฉันต้องการ varchar เนื่องจากค่าถูกตัดออกจากค่าสตริง .. ฉันหมายถึงอ่านสิ่งที่เขียน ..
Bilgin Kılıç

@MartinSmith ppl ผลักดันให้ฉันเปลี่ยนแปลง ดังนั้นทำเครื่องหมายคำตอบของคุณกลับมาอีกครั้ง ขอบคุณสำหรับ komments ของคุณ
Bilgin Kılıç

ดูเหมือนว่าผู้คนจะเจอสิ่งนี้จากเครื่องมือค้นหาและจากการโหวตพารามิเตอร์ style 2 นั้นดูเหมือนจะจำเป็นมากกว่า แต่สิ่งนี้ไม่ได้ทำตามความต้องการเดิมของคุณ
Martin Smith

คำตอบ:


93

"การแปลงเป็นvarbinarya varchar" อาจหมายถึงสิ่งต่างๆ

หาก varbinary เป็นฐานเป็นตัวแทนของสตริงใน SQL Server (ตัวอย่างเช่นกลับโดยการหล่อจะvarbinaryโดยตรงหรือจากDecryptByPassPhraseหรือDECOMPRESSฟังก์ชั่น) คุณสามารถเพียงแค่CASTมัน

declare @b varbinary(max)
set @b = 0x5468697320697320612074657374

select cast(@b as varchar(max)) /*Returns "This is a test"*/

นี้จะเทียบเท่าของการใช้กับรูปแบบของพารามิเตอร์CONVERT0

CONVERT(varchar(max), @b, 0)

พารามิเตอร์รูปแบบอื่น ๆ มีให้CONVERTสำหรับความต้องการที่แตกต่างกันดังที่ระบุไว้ในคำตอบอื่น ๆ


39
คำตอบนี้ไม่ถูกต้อง ฉันทดสอบบนโต๊ะด้วย SID ของผู้ใช้ - จำนวนของค่าที่แตกต่างจากการร่ายจะน้อยกว่าจำนวนของ SID ไบนารีที่แตกต่างกัน คุณควรใช้ CONVERT (VARCHAR (... ), binaryValue, 2) เพื่อให้ได้ค่าที่ไม่ซ้ำกัน - คำตอบจาก Gunjan Juyal เป็นสิ่งที่ถูกต้อง - ควรทำเครื่องหมายเป็นโซลูชัน
Philipp Munin

13
@PhilippMunin - คำตอบสองคำตอบต่างกัน อันนี้รับผลลัพธ์ของนิพจน์เช่นSELECT CAST('This is a test' AS VARBINARY(100))ซึ่งอยู่0x5468697320697320612074657374ในการเปรียบเทียบเริ่มต้นของฉันและแปลงกลับเป็นvarcharสตริง คำตอบของ Gunjan ส่งกลับการแสดงเลขฐานสิบหกเป็นสตริง ('5468697320697320612074657374') การตีความนี้ถูกต้องตามความต้องการของ OP เนื่องจากพวกเขายอมรับ
Martin Smith

8
คำตอบนี้ถูกต้อง! ฉันทดสอบและทำในสิ่งที่ฉันและ OP ต้องการ
Ronnie Overby

1
@BIDeveloper หากคุณได้อ่านความคิดเห็นด้านบน (โดยเฉพาะของฉัน) คุณควรตระหนักว่าปัญหาคือ "การแปลง varbinary เป็น varchar" สามารถตีความได้หลายวิธี นี่คือสาเหตุที่CONVERTมีพารามิเตอร์ style เพื่อเลือกแบบที่คุณต้องการ (การตีความของฉันคือสไตล์เริ่มต้น) ดังนั้นคำตอบนี้อาจไม่ใช่สิ่งที่คุณต้องการสำหรับกรณีการใช้งานของคุณในขณะนี้ แต่ถูกต้องสำหรับกรณีการใช้งานอื่น ๆ รวมถึงผู้ถามเดิมที่ระบุว่า "รูปแบบที่มนุษย์อ่านได้" ไม่ใช่ฐานสิบหก
Martin Smith

1
SQL 2005 คุณสามารถใช้ sys.fn_sqlvarbasetostr (@binary) ได้เนื่องจาก CONVERT จะว่างสำหรับฉัน
TheNerdyNerd

153

นิพจน์ต่อไปนี้ใช้ได้ผลสำหรับฉัน:

SELECT CONVERT(VARCHAR(1000), varbinary_value, 2);

นี่คือรายละเอียดเพิ่มเติมเกี่ยวกับการเลือกสไตล์ (พารามิเตอร์ที่สาม)


1
ตามที่อธิบายโดย @ lara-mayugba ด้านล่างสไตล์ 1 จะมีคำนำหน้า 0x ในผลลัพธ์ซึ่งสามารถเป็นประโยชน์ ..
สแตน

@celerno ทำไมพวกเขา? สิ่งนี้ไม่ได้ทำในสิ่งที่พวกเขาต้องการ
Martin Smith

1
ก่อนปี 2008 ใช้ sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd

@metabuddy - เป็นข้อมูลที่ผิดในทางใด? ระบุว่าคำว่า "การแปลง varbinary เป็น varchar" สามารถทำได้หลายวิธีและสิ่งเหล่านี้ถูกควบคุมโดยพารามิเตอร์ style เพียงเพราะพารามิเตอร์สไตล์ในคำตอบนั้นไม่ใช่พารามิเตอร์ที่คุณต้องการสำหรับกรณีของคุณ (แต่เป็นพารามิเตอร์ที่ตอบคำถามเดิม) ไม่ได้ทำให้ข้อมูลผิดพลาด
Martin Smith

1
เพื่อเน้นความคิดเห็น / คำตอบของ @TheNerdyNerd นิพจน์จะเป็น `` select sys.fn_sqlvarbasetostr (@b) / * คืนค่า 0x5468697320697320612074657374 * / สมมติว่ามีการเปลี่ยนแปลง varchar (สูงสุด) เป็น varchar (8000) เนื่องจากก่อนปี 2008 ไม่ได้ใช้ .
Zachary Scott

68

จริงๆแล้วคำตอบที่ดีที่สุดคือ

SELECT CONVERT(VARCHAR(1000), varbinary_value, 1);

โดยใช้ " 2" ตัด " 0x" ที่จุดเริ่มต้นของไฟล์varbinary.


@BojieShuai คุณหมายถึง "ฉันเห็นด้วยมากจนเป็นไปไม่ได้ที่ฉันจะเห็นด้วยมากกว่านี้" หรือ "ฉันเคยเห็นด้วย แต่ฉันไม่ทำอีกต่อไป"
howcheng

@howcheng ฉันหมายถึง "ไม่เห็นด้วยมากกว่านี้" ขอบคุณที่ชี้ให้เห็น
Bojie Shuai

"ฉันเคยเห็นด้วย แต่ตอนนี้ฉันไม่เห็นด้วย" จะเป็น "ฉันไม่เห็นด้วยอีกต่อไป " (คำเดียวไม่ใช่ " อีกต่อไป " สองคำ) Anymore<> any more. พื้นที่ใด ๆ เพิ่มเติม = "ในระดับหรือองศาที่มากขึ้น"
ทิม

15

ลองทำตามนี้

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)

6
ฉันต้องใช้ 2 เป็นพารามิเตอร์ตัวที่สามแทนที่จะเป็นศูนย์ ผมพบคำตอบที่นี่
WEFX

1
ในกรณีของฉันฉันต้องใช้ MAX แทน 5,000
sulaiman sudirman

0

สำหรับVARBINARY(MAX)คอลัมน์ฉันต้องใช้NVARCHAR(MAX):

cast(Content as nvarchar(max))

หรือ

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value

0

ฉันลองแล้วมันได้ผลสำหรับฉัน:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.