2

データベース (MySql) では、いくつかの文字列値を保存し、保存する前にそれらの文字列の一意性をチェックしています。

高速な文字列比較 (記録する前に着信文字列が既に DB に存在するかどうかを確認することを意味します) の場合、着信文字列 (MD5) を高速化し、文字列を 2 つの等しい部分に分割し、それらを 2 つの bigint に変換し、別々に保存します。文字列を使用して、レコード要求が到着したら、複数列のインデックスでこれらの 2 つの bigint を検索したいと考えています。(もちろん、着信文字列、MD5 その文字列を取得し、2 つの bigint 部分を計算してから、データベースにクエリを実行します)

しかし、以下の「3 行目」では、「MySql Routine」で興味深いエラーが発生します。

...
declare mystring varchar(3000); -- line 1
declare md5bigint1value bigint; -- line 2
...

set md5bigint1value = conv(substring((md5(mystring)),1,16),16,10); -- line 3
...

「3 行目」で、エラー コード: 1264 と表示されます。

なぜこれが起こっているのか誰にも分かりますか?

さらに情報が必要な場合はお知らせください。どうもありがとうございました。

4

1 に答える 1

4

CONVは、正の to_base とともに使用すると、符号なしの値に変換されますが、符号付きですBIGINT。符号なし 64 ビット値は、必ずしも符号付き 64 ビット変数に収まるとは限りません。

to_base が負の数の場合、N は符号付きの数と見なされます。それ以外の場合、N は符号なしとして扱われます。

あなたがしたいことは-10、目的地のベースに使用することです。

set md5bigint1value = conv(substring((md5(mystring)),1,16),16,-10); -- line 3

テストする SQLfiddle (10 では機能せず、-10 では機能します)。

于 2013-04-11T18:01:57.477 に答える