2

MySQLに保存するためにTEXTを圧縮したい。したがって、phpでgzcompress()を実行してからmysqlに送信しますが、Sphinx全文検索も設定しているので、インデックスに単純なクエリを入力できると便利です。

select uncompress(thing) from table

ただし、mysqlではなくphpでアプリケーションの圧縮と解凍を行い、スフィンクスのインデックス作成にはmysql uncompress()関数のみを使用したいと思います。

mysqlのドキュメントには、その圧縮機能について次のように記載されています。

空でない文字列は、圧縮されていない文字列の4バイト長(下位バイトが最初)として格納され、その後に圧縮された文字列が続きます。

だから私の質問は...この4バイトの長さの非圧縮文字列をどのように構築するのですか?その後、圧縮されたBLOBは、php gzcompress()関数の結果と同じようになります。

4

2 に答える 2

3

これを行ったことはありませんが、ここにいくつかの考えがあります:

1)圧縮されていない文字列の長さを見つけます... strlen()関数は機能するはずです

2) 文字列を圧縮します...この部分は既に完了しています

3) mysql に格納するために両方をパックし、mysql が必要とするように数値をフォーマットします。

php のpack 関数: 長さ (unsigned long... 32 ビット、リトルエンディアンのバイト順) にフォーマット値「V」を使用する必要があるようです。

于 2010-02-01T14:32:50.140 に答える
0

これがそのシナリオの私のコードです。解凍するには、PHP を使用して、最初の 4 バイト離れた substr を調整することもできます。
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
于 2016-10-12T16:45:28.107 に答える