当您运行此查询:
select compress('this is just a sample string')
(例如使用MSSQL Server Management Studio),您将看到二进制压缩文本的十六进制格式的
文本表示形式。
我用被转换为
varchar
和
nvarchar
的
lorem ipsum长文本进行了测试(您可能会注意到该文本内部没有双字节字符,但对于这个示例没有关系):
这个压缩后的长文本存储在MSSQL的一个
varbinary(max)
列中:
--------VARCHAR---------- --------NVARCHAR--------
Original Hex Binary Original Hex Binary
13046 4024 2011 13046 4748 2373
所以,在这里最好的选择是传输二进制数据,而
不是十六进制表示形式。
告诉浏览器响应已经被gzip压缩:
服务器端: 这里有一个PHP示例端点:
<?php
header("Content-Encoding: gzip");
header("Vary: Accept-Encoding");
header("Content-type: text/html; charset=UTF-16");
$serverName = 'testserver';
$connectionOptions = array('Database'=>'testdatabase');
$conn = sqlsrv_connect($serverName, $connectionOptions);
$sql = 'SELECT compressed FROM tb_compression WHERE id = 1';
$qry = sqlsrv_query($conn, $sql);
$row = sqlsrv_fetch_array($qry);
$compressed = $row[0];
sqlsrv_close($conn);
echo $compressed;
?>
客户端:这是一个JavaScript的工作示例:
var request = new XMLHttpRequest();
request.onload = function(e) {
var text = e.currentTarget.responseText;
console.log(text);
};
request.responseType = 'text';
request.open('GET', 'getcompressed.php', true);
request.send(null);
这个方法在Chrome和FF中都适用,你可以试试。
使用gunzip JavaScript库:
服务器端:以下是一个PHP示例端点:
<?php
header('Content-Type: application/octet-stream');
$serverName = 'testserver';
$connectionOptions = array('Database'=>'testdatabase');
$conn = sqlsrv_connect($serverName, $connectionOptions);
$sql = 'SELECT compressed FROM tb_compression WHERE id = 1';
$qry = sqlsrv_query($conn, $sql);
$row = sqlsrv_fetch_array($qry);
$compressed = $row[0];
sqlsrv_close($conn);
echo $compressed;
?>
客户端: 这是一个JavaScript的工作片段:
致谢: 此处用于解压缩的库gunzip.min.js来自Imaya Yuta.
var request = new XMLHttpRequest();
request.onload = function(e) {
var response = new Uint8Array(e.currentTarget.response);
console.log(response.byteLength);
var compressed = response.subarray(0, response.byteLength - 4);
var gunzip = new Zlib.Gunzip(compressed);
var decompressed = gunzip.decompress();
var encoding = 'utf-8';
var text = new TextDecoder(encoding).decode(decompressed);
console.log(text);
};
request.responseType = 'arraybuffer';
request.open('GET', 'getcompressed.php', true);
request.send(null);
如果您查看响应字节长度
,以13046字节的示例文本为例,您将会发现只有2015字节实际上在网络上传输。
compress()
函数返回一个GZIP压缩的字节数组,因此您需要查找或编写相应的代码来进行解压缩。JavaScript中没有内置类似的功能,给出库或其他外部资源的建议被视为不适合在SO上讨论的话题。 - Karl-Johan Sjögrenvarbinary
列中是可以的。请参见此处:SQL Server 2016中的压缩和解压缩函数。但是:您是否尝试启用动态压缩并从服务器提供gzipped文本内容?传输的gzipped文本将在客户端浏览器上透明处理,无需自定义JavaScript解压缩循环的开销。 - deblocker