Как реализовать функцию mysql compress () в php - PullRequest
2 голосов
/ 01 февраля 2010

Я хочу сжать TEXT для хранения в MySQL. Поэтому я бы просто сделал gzcompress () в php и затем отправил в mysql, но я также настраиваю полнотекстовый поиск Sphinx, и было бы неплохо, если бы он мог заполнить свой индекс простым запросом, т.е.

select uncompress(thing) from table

Однако я все же хотел бы выполнять сжатие и распаковку для приложения в php, а не в mysql, и использовать только функцию mysql uncompress () для индексации сфинксов.

В документации mysql говорится о функции сжатия:

Непустые строки сохраняются как четырехбайтовая длина несжатого строка (сначала младший байт), затем сжатая строка.

Итак, мой вопрос ... как мне построить эту длину в четыре байта несжатой строки? После этого сжатый BLOB выглядит так же, как и результаты функции php gzcompress ().

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

никогда не делал этого, но вот некоторые мысли:

1) найти длину несжатой строки ... функция strlen () должна работать

2) сжать строку ... вы уже сделали эту часть

3) упакуйте их вместе для хранения в mysql, отформатировав число так, как того хочет mysql:

php's pack pack : звучит так, как будто вам нужно использовать значение формата "V" для длины (беззнаковый длинный ... 32-битный, байтовый порядок в младшем порядке)

0 голосов
/ 12 октября 2016

Вот мой код для этого сценария, для распаковки вы также можете использовать PHP и подстроку djust за первые 4 байта.
Вывод mysql:

mysql : "select hex(compress('1234512345'))"
0A000000789C3334323631350411000AEB01FF

PHP эквивалент:

$string="1234512345";
$data=gzcompress($string);
$len=mb_strlen($string);
$head=pack('V',$len);

echo($head);
echo($data);

Вывод PHP:

php test.php  | hexdump -C
00000000  0a 00 00 00 78 9c 33 34  32 36 31 35 04 11 00 0a
...