sql >> データベース >  >> RDS >> Sqlserver

SQL Serverのrowversionをlongまたはulongに変換しますか?

    重要です。 比較の結果をSQLServerの比較と同じにする必要があります。 SQL Serverは、バイナリタイプで符号なし比較を使用します:

    select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end
    

    longで同じことをする場合 署名されている、0xFFFFFFFFFFFFFFFF -1を表します 。つまり、比較は正しくありません。 SQLServerで行われた同じ比較とは一致しません。

    絶対に必要なのは、 ulongを使用することです ここで、0xFFFFFFFFFFFFFFFF ulong.MaxValueです 。

    エンディアンも重要です

    さらに、マークが指摘したように、BitConverter.GetUInt64 正しく変換されていません。マークは完全に正しくない -BitConverter 実行しているシステムに応じて、ビッグエンディアンまたはリトルエンディアンのいずれかになります。 これを自分で確認 できます 。また、BitConverterが常にリトルエンディアンであったとしても、Array.Reverse ヒープ割り当てとバイトごとのコピーではパフォーマンスが低下します。 BitConverter 意味的にも実際的にもその仕事に適したツールではありません。

    これはあなたが望むものです:

    static ulong BigEndianToUInt64(byte[] bigEndianBinary)
    {
        return ((ulong)bigEndianBinary[0] << 56) |
               ((ulong)bigEndianBinary[1] << 48) |
               ((ulong)bigEndianBinary[2] << 40) |
               ((ulong)bigEndianBinary[3] << 32) |
               ((ulong)bigEndianBinary[4] << 24) |
               ((ulong)bigEndianBinary[5] << 16) |
               ((ulong)bigEndianBinary[6] <<  8) |
                       bigEndianBinary[7];
    }
    

    最もクリーンなソリューション

    更新 :.NET Core 2.1以降(または.NET Standard 2.1)を使用している場合は、 BinaryPrimitives.ReadUInt64BigEndian これは完璧にフィットします。

    .NET Frameworkで使用するソリューションは、次のとおりです。 Timestamp.cs 。基本的に、Timestampにキャストすると 、間違いはありません。



    1. LaravelCrypt-値の比較

    2. RHEL8にMariaDB10をインストールする方法

    3. Oracle SQLを使用して、1つの出力日数と曜日をどのように出力しますか?

    4. MariaDB Xpand(以前のClustrixDB)の概要