Có (hiện tại) có hai cách để thực hiện nén tùy chỉnh:
Bắt đầu trong SQL Server 2016, có các hàm dựng sẵn cho COMPRESS và DECOMPRESS . Các hàm này sử dụng thuật toán GZip.
Sử dụng SQLCLR để thực hiện bất kỳ thuật toán nào bạn chọn (như @Remus đã đề cập trong câu trả lời của anh ấy). Tùy chọn này có sẵn trong các phiên bản trước SQL Server 2016, sẽ quay trở lại SQL Server 2005.
GZip là một lựa chọn dễ dàng vì nó có sẵn trong .NET và trong các thư viện .NET Framework được hỗ trợ (mã có thể nằm trong một SAFE
hội). Hoặc, nếu bạn muốn GZip nhưng không muốn xử lý mã hóa / triển khai nó, bạn có thể sử dụng các hàm Util_GZip và Util_GUnzip có sẵn trong phiên bản Miễn phí của thư viện SQL # SQLCLR (mà tôi là tác giả).
Nếu bạn quyết định sử dụng GZip, cho dù bạn tự viết mã hay sử dụng SQL #, xin lưu ý rằng thuật toán được sử dụng trong .NET để thực hiện nén GZip trong phiên bản Framework 4.5 để tốt hơn (xem phần "Ghi chú" trên MSDN trang cho Lớp GZipStream ). Điều này có nghĩa là:
- Nếu bạn đang sử dụng SQL Server 2005, 2008 hoặc 2008 R2 - tất cả được liên kết với CLR v 2.0 xử lý các phiên bản Framework 2.0, 3.0 và 3.5 - thì thay đổi được thực hiện trong Framework phiên bản 4.5 không có hiệu lực và bạn không may bị mắc kẹt với Thuật toán gốc, sucky của .NET.
- Nếu bạn đang sử dụng SQL Server 2012 hoặc mới hơn (cho đến năm 2014 và 2016) - tất cả được liên kết với CLR v 4.0 xử lý các phiên bản Framework 4.0, 4.5.x, 4.6 - thì bạn có thể sử dụng thuật toán mới hơn, tốt hơn. Yêu cầu duy nhất là bạn đã cập nhật .NET Framework trên máy chủ đang chạy SQL Server thành phiên bản 4.5 trở lên.
Tuy nhiên, bạn không phải sử dụng GZip và được tự do thực hiện bất kỳ thuật toán nào.
XIN LƯU Ý: tất cả các phương pháp được ghi chú ở trên là "giải pháp thay thế" thay vì là thay thế thực tế, mặc dù về mặt kỹ thuật chúng là "cách thay thế để nén dữ liệu NVARCHAR (MAX)". Sự khác biệt là với Nén dữ liệu tích hợp - row
và page
- được cung cấp bởi SQL Server, việc nén được xử lý phía sau hậu trường và dữ liệu vẫn có thể sử dụng, có thể đọc và lập chỉ mục. Nhưng nén bất kỳ dữ liệu nào thành một VARBINARY
phương tiện mà bạn đang tiết kiệm dung lượng, nhưng lại từ bỏ một số chức năng. Đúng, dù sao thì một chuỗi 20k không thể lập chỉ mục được, nhưng nó vẫn có thể được sử dụng trongWHERE
mệnh đề, hoặc với bất kỳ hàm chuỗi nào. Để làm bất cứ điều gì với một giá trị nén tùy chỉnh, bạn sẽ cần phải giải nén nó một cách nhanh chóng. Khi nén các tệp nhị phân (PDF, JPEG, v.v.), đây không phải là vấn đề, nhưng câu hỏi này là dành riêng cho NVARCHAR
dữ liệu.