OracleとSQL Serverの間でETLプロセス(プライマリキーなし - トランザクションレプリケーションなし)を行い、MD5ハッシュを使用してソースとデスティネーションデータベースの違いを検出しています。SQL Serverハッシュバイスと拡張Ascii
これは、データが最初の127文字のASCII文字に該当するレコードでは問題ありません。しかし、,°
または©
のような '拡張ascii' *文字がある場合、SQL ServerのHASHBYTES
関数はこれらの文字を非標準的な方法でハッシュします(つまり、OracleのDBMS_CRYPTO.Hash
、.Net暗号化ライブラリなどとは異なります)。
だから私は、Oracleでこれを実行すると:
select rawtohex(
DBMS_CRYPTO.Hash (
UTL_I18N.STRING_TO_RAW ('°', 'AL32UTF8'),
2)
) from dual;
私が取得:4723EB5AA8B0CD28C7E09433839B8FAE
。
そして私は、SQL Serverでこれを実行すると:EC655B6DA8B9264A7C7C5E1A70642FA7
そして、私はこのC#のコードを実行する場合:
SELECT HASHBYTES('md5', '°');
私が手
string password = "°";
// byte array representation of that string
byte[] encodedPassword = new UTF8Encoding().GetBytes(password);
// need MD5 to calculate the hash
byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword);
// string representation (similar to UNIX format)
string encoded = BitConverter.ToString(hash)
// without dashes
.Replace("-", string.Empty)
// make lowercase
.ToLower();
を私は4723EB5AA8B0CD28C7E09433839B8FAE
を得ると同じすなわちオラクルと私が使用したすべてのオンラインツールで。
この問題のSQLベースのソリューションはありますか、またはCLRストアドプロシージャを作成し、そこにデータをハッシュする必要がありますか?
*私は今のようにMS SQL Serverには、UTF-8のサポートはありません用語は
MD5は、MD5で出力が異なる場合は、入力が異なる - 場合入力は、入力のバイナリ解釈に関連するエンコーディングの問題と同じに見えます。そのようなHASHBYTES()コールの入力と出力を期待どおりの結果とともに表示できますか? –
SQL Serverは、ISO-8859-1、 'HASHBYTES(' md5 '、N'° ');と解釈される文字列のハッシュを返すと、Oracleで使用できる場合はUTF16結果が返されますか? –
[C#.NET md5とは異なるTSQL md5ハッシュ]の重複の可能性があります(http://stackoverflow.com/questions/27908449/tsql-md5-hash-different-to-c-sharp-net-md5) –