2012-01-11 16 views
2

整数をネットワークの順序に変換し、結果のバイトを文字列データベースのインデックス可能なエンティティに書き込むという常識は見ていませんそのようなデータベースのドキュメンテーションのどこにでも番号の文字列表現を書く。ビッグエンディアンのバイトと文字列データベースのキーとしての文字列

文字列として64ビットintをデータベースに書き込む場合のオーバーヘッドは、バイトを整数型に書き戻す前にntohl呼び出しを行う必要があるという単純な複雑さよりも重要です。

ここで何かが欠けていますが、ビッグエンディアンバイトと文字列文字列データベースのインデックス可能エンティティとしての文字列の違いは何ですか?

(プログラム型のメモリ位置にバイトを書き込むことについてはC++/Cタグ、BDBは使用しているデータベースであるため、kyotodbも可能です)。

答えて

2

この場合のビッグエンディアンの利点は、文字列が昇順で正しくソートされることです。

データベースアーキテクチャで64ビット整数をネイティブに保存できない場合でも、それらを格納する必要がある場合は、この方法で文字列を変更することができます。

もちろん、後でデータベースを64ビット整数をネイティブに格納できるものにアップグレードする場合は、実装に「固執する」か、移行プロセスを実行する必要があります。

+0

私はあなたが言っていることを読むでしょう。アーキテクチャに互換性のあるネイティブデータ型がない場合。しかし、 'boost :: lexical_cast (std :: string)'のようなものも可能です。私はそのような変換がある古い学校のハードウェアでは高価すぎることが判明するかもしれないと思う。 –

+0

値を変換することは、物事のスキームにおいて非常に高価な操作であることはまずありません。 (boost :: lexical_castは最適な方法ではありませんが、大量の結果セットを変換している場合など、パフォーマンスの問題が発生する可能性があります)。 – CashCow

+0

私は昇順の並べ替え順序と大きさと速度の改善が無視するのが良いと結論していると思いますか? :問題のデータベース技術(具体的にはBDB)は、実際には 'recno'モードで32ビット整数でしか機能できません(おそらくネイティブが意味するものです)。あなたの答えをもう少し積極的に編集した場合(つまり、データベースにインデックス可能な値として使用するネイティブタイプがない場合、文字列に埋め込まれたビッグエンディアンの整数バイトが文字列表現より優れています)私はそれを受け入れます:D 。 –

2

あなたが送信する文字列データが予想されるエンコードで有効であることをデータベースが検証した場合、必要なデータを与えるだけではありません。あなたは有効なエンコーディングのように見えるような整数だけを送ることができます。私はBDBかkyotodbがそのような検証をするかどうかわかりません。

また、他のものを保持するために1つのデータ型をトリックしようとすると、クライアントに頼ってそのトリックを知っているように思えます。もちろん、文字列を使用して整数のASCII 10進表現を保持している場合でも、整数を保持するために文字列を生のメモリバッファとして使用している場合でも、それは当てはまります。文字列ではなく、保持したい型を実際に保持するデータベースを使用するほうがよいでしょう。

関連する問題