4

SHA1ハッシュをBINARY(20)列に格納したいと思います。準備してINSERT INTO foo SET ( hash=? )から、20バイトのバイナリ値を含む変数にバインドするステートメントを実行してみましたが、実行時の構文エラー「... hash ='\ 0 \ 0#* $ ^!...'」が発生しました。(プリペアドステートメントを実行するとこのような値が表されるのはなぜか困惑しています。) この投稿は、SHA1をBINARY(20)列に格納することに問題があることを示していませんが、SQLでどのように行われるかを示していません。

更新:「なぜ16進数ではなく2進数なのですか?」約10億行になるので、20バイト余分に重要です。また、数値ルックアップは文字列ルックアップの2倍の速度であると言われています(また、BINARYフィールドは数値のように扱われます)

更新2:エラーメッセージは、バイナリ値の表現についてではなく、SETリストを囲む括弧について不平を言っていました。

4

3 に答える 3

4

UNHEX関数を使用して、挿入前に変換します。

 INSERT INTO foo SET hash=UNHEX('0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33');

スペース要件に取り組む必要がありますが、ハッシュをバイナリから16進数に変換し、バイナリに戻すと、パフォーマンスが低下する可能性があります。

于 2013-01-30T16:21:52.060 に答える
1

特別なことは何もする必要はないと思います。

mysql> CREATE TABLE binary_test (
    ->     id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ->     hash BINARY(20) NOT NULL,
    ->     PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> DELIMITER //
mysql> CREATE PROCEDURE binary_insert(IN hash BINARY(20))
    -> BEGIN
    ->     INSERT INTO binary_test (hash) VALUES (hash);
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL binary_insert( UNHEX(SHA1('password')) );
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM binary_test;
+----+----------------------+
| id | hash                 |
+----+----------------------+
|  1 | [¬aõ╔╣??♠é%♂l°3←~µÅÏ |
+----+----------------------+
1 row in set (0.00 sec)
于 2013-01-30T16:31:43.067 に答える
0

文字列から最終的なSQLをつなぎ合わせる場合は、SHA1の16進文字列の前に。を付け0xます。ここでは、SHA1文字列を計算するか、与えられたと仮定します。たとえば、変数でstrSha1

strSQL = "INSERT INTO TableName SET BinaryHash=0x";
strSQL .= strSha1;
DbConn.Query(strSQL);

または、パラメータ化または準備されたSQLを使用している場合は、以下の擬似コードを参照してください。

preparedStmt = DbConn.Prepare("INSERT INTO TableName SET BinaryHash = UNHEX( ? )");
DbConn.Query(preparedStmt, strSha1);

明らかにSHA1()、後者の場合、SHA1ではなく、プレーンな文字列が与えられていれば、MySQLの関数を使用できます。

于 2013-05-07T12:42:17.220 に答える