2010-09-07 30 views
7

ai đó xin vui lòng giải thích tại sao chọn len (0x0a000b) trả về 3? len đếm byte? và tại sao chọn trái (0x0a000b, 1) trả về không có gì? tôi mong đợi 0x0a (nếu len đếm byte) ...len của varbinary

tôi đang sử dụng MSSQL 2005

nhờ Konstantin

Trả lời

5

select len(0x0a000b) đang trả về độ dài của chuỗi được biểu thị bằng ba byte 0x0a, 0x00 và 0x0b.

select left(0x0a000b, 1) trả về ký tự ngoài cùng bên trái của chuỗi, là ký tự dòng mới.

Lưu ý rằng select case when left(0x0a000b, 1) = 0x0a then 1 else 0 end trả lại 1, điều này cho biết thực tế bạn đang nhận được ký tự dòng mới.

Chỉnh sửa: Vui lòng xem các nhận xét bên dưới để biết thêm chi tiết.

+0

Vui lòng cập nhật đề cập đến rằng bên trái sẽ trả về varchar thay vì nhị phân và sử dụng chuỗi con thay thế. – ErikE

3

trái được các nhà điều hành chuỗi và vì vậy nó không hoạt động trên dữ liệu nhị phân trong theo cách bạn mong đợi nó hoạt động, hãy sử dụng chuỗi con (@v, 1, 1) thay vào đó, hãy sử dụng chiều dài của dữ liệu nhị phân (ngoài các loại dữ liệu khác), thay vào đó hãy sử dụng chiều dài của dữ liệu nhị phân (ngoài các loại dữ liệu khác); mặc dù, có một ngoại lệ rất thú vị đối với các chuỗi, khi chúng ta đo chiều dài của một chuỗi bằng lệnh này, đầu tiên nó thực hiện rtrim trên nó; vì vậy len ('a') sẽ trả về 1

+0

không đúng ... chọn trái (0x45000b, 1) – SQLMenace

+0

Tuyệt đối! Không phải cách bạn mong đợi nó hoạt động. –

+0

@SQLMenace Thử 'chọn chuỗi con (0x45000b, 1, 1)' trả về 0x45 nhưng lựa chọn của bạn trả về 'E' – ErikE

1

sẽ ai đó hãy giải thích tại sao chọn len (0x0a000b) trả về 3

nó được 3 nhân vật
0x có nghĩa là nó là nhị phân

nhân vật 0a 1
00 nhân vật 2
0b ký tự 3

bạn có ký tự không thể in được, tôi tin 0a là phương tiện vận chuyển rn, chạy này

select left(0x45000b, 1) 
Các vấn đề liên quan