当您运行此查询时:select compress('this is just a sample string')(例如使用 MSSQL Server Management Studio)您将看到 二进制文件的 十六进制 格式的 text 表示 压缩文本。
我对 lorem ipsum 长文本进行了测试,该长文本也被转换为 varchar 和 nvarchar(您可能会注意到该文本中没有双字节字符,但它这个例子没关系):
这个压缩的长文本存储在 MSSQL 的 varbinary(max) 列中:
--------VARCHAR------------ --------NVARCHAR--------
原始十六进制二进制原始十六进制二进制
13046 4024 2011 13046 4748 2373
所以,这里最好的选择是从后端传输二进制数据,不是十六进制表示。
告诉浏览器响应已被压缩:
服务器端:这是 PHP 中的示例端点:
<?php /* getcompressed.php */
header("Content-Encoding: gzip");
header("Vary: Accept-Encoding");
header("Content-type: text/html; charset=UTF-16"); /* nvarchar */
$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 中工作的 sn-p:
var request = new XMLHttpRequest();
request.onload = function(e) {
var text = e.currentTarget.responseText;
console.log(text); /* Here You go */
};
request.responseType = 'text';
request.open('GET', 'getcompressed.php', true);
request.send(null);
这在 Chrome 和 FF 中也适用于我。试试看。
使用 gunzip javaScript 库:
服务器端:这是 PHP 中的示例端点:
<?php /* getcompressed.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 中工作的 sn-p:
CREDIT:这里用于解压的库是gunzip.min.js from Imaya Yuta。
var request = new XMLHttpRequest();
request.onload = function(e) {
var response = new Uint8Array(e.currentTarget.response);
console.log(response.byteLength);
/* Strip out the response termination */
var compressed = response.subarray(0, response.byteLength - 4);
var gunzip = new Zlib.Gunzip(compressed);
var decompressed = gunzip.decompress();
var encoding = 'utf-8'; /* For varchar text (ansi) */
//var encoding = 'utf-16'; /* For nvarchar text (double-byte) */
var text = new TextDecoder(encoding).decode(decompressed);
console.log(text); /* Here You go */
};
request.responseType = 'arraybuffer';
request.open('GET', 'getcompressed.php', true);
request.send(null);
如果您查看 response.byteLength,例如 13046 字节的文本,您将检查是否只有 2015 字节有效地通过网络传输。