Когда вы выполните этот запрос: select compress('this is just a sample string')
(например, с помощью MS SQL Server Management Studio) Вы увидите текст представление в шестнадцатеричном формате двоичный сжатый текст.
Я провел тест с длинным текстом lorem ipsum , приведенным также как varchar
и nvarchar
(Вы можете заметить, что внутри этого текста нет двухбайтовые символы, но для этого примера это не имеет значения):
Этот сжатый длинный текст хранится в столбце varbinary(max)
внутри MS SQL:
--------VARCHAR---------- --------NVARCHAR--------
Original Hex Binary Original Hex Binary
13046 4024 2011 13046 4748 2373
Таким образом, лучший выбор здесь - это передать из серверной части двоичные данные, , а не шестнадцатеричное представление.
Сообщите браузеру, что ответ получен в формате gzip. :
СТОРОНА СЕРВЕРА : Вот пример конечной точки в 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:
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 Библиотека:
SERVER SIDE : Вот пример конечной точки в 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:
КРЕДИТ: библиотека, используемая здесь для распаковки, gunzip.min. js от Имая Юта .
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 года.