Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server varbinary bigint với BitConverter.ToInt64 các giá trị khác nhau

Truyền từ varbinary thành bigint (và trở lại) sử dụng thứ tự byte mạng (big-endian). BitConverter sử dụng endian-ness của máy mà nó được chạy (little-endian cho x86 và x64).

Do đó BitConverter.GetBytes chạy trên -8588797048854775808 (0x88CE7696E7167800) là {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} và cast trên {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} là 0x0088E91869893177 =38536887891734903.

Điều rõ ràng cần làm là chỉ lưu trữ số nguyên 64 bit dưới dạng số nguyên 64 bit ngay từ đầu.

Nếu bạn thực sự cần thực hiện chuyển đổi này thì:

var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))

Sẽ hoán đổi xung quanh các byte, đồng thời có tính di động vì nó sẽ không hoán đổi các byte nếu chạy trên máy big-endian.

Ngoài ra, nếu bạn không muốn sử dụng không gian tên System.Net vì lý do nào đó hoặc nếu bạn muốn có thể mở rộng sang các loại khác với ba IPAddress.HostToNetworkOrder handeles, sử dụng:

var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
  Array.Reverse(savedValue);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để làm cho các ràng buộc khóa ngoại đáng tin cậy?

  2. Cách thêm Ràng buộc khóa chính vào Cột nhận dạng vào tất cả các bảng trong Cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 63

  3. LIÊN KẾT TẤT CẢ và KHÔNG VÀO cùng nhau

  4. Chọn 10 bản ghi hàng đầu cho mỗi danh mục

  5. Có cách nào để nhận được các kết quả khác nhau cho cùng một truy vấn SQL nếu dữ liệu được giữ nguyên không?