不正确的Guid秩序(Incorrect Guid order)

2019-09-18 10:49发布

好吧,我有一个GUID f5cc4100-f1b4-4af6-9e9e-224b0eb74166 ,我使用ADO .NET连接器其插入到MySQL数据库。

我能做到这一点有两种方式:

1)饲料字节数组.NET连接器

string query = "insert into test (pk_id) values (@id)";
using (var c = new MySqlCommand(query, conn))
{
    c.Parameters.AddWithValue("@id", new Guid("f5cc4100-f1b4-4af6-9e9e-224b0eb74166").ToByteArray());
    c.ExecuteNonQuery();
}

2)依靠MySQL的标准功能,以十六进制转换为二进制字符串。

string query = "insert into test (pk_id) values (UNHEX(@id))";
using (var c = new MySqlCommand(query, conn))
{
    c.Parameters.AddWithValue("@id", "f5cc4100-f1b4-4af6-9e9e-224b0eb74166".Replace("-", "");
    c.ExecuteNonQuery();
}

我面对的问题是上述两种方式插入在略微不同的字符顺序相同的GUID。

如果我选择回来的插入GUID是这样的:

string query = "select PK_id from test";
using (var c = new MySqlCommand(query, conn))
{
    using (var r = c.ExecuteReader())
    {
        while (r.Read())
        {
            var k = new Guid((byte[])r[0]);
        }
    }
}

我得到f5cc4100-f1b4-4af6-9e9e-224b0eb741660041ccf5-b4f1-f64a-9e9e-224b0eb74166回来。 但是,如果我读这样的:

string query = "select hex(PK_id) from test";
using (var c = new MySqlCommand(query, conn))
{
    using (var r = c.ExecuteReader())
    {
        while (r.Read())
        {
            var k = new Guid((string)r[0]);
        }
    }
}

我得到0041ccf5-b4f1-f64a-9e9e-224b0eb74166f5cc4100-f1b4-4af6-9e9e-224b0eb74166

总之,如果我插入GUID作为ByteArray对象,然后我需要阅读它们的方式和强制转换为字节数组,以获得正确的GUID。 如果我插入GUID作为UNHEX十六进制GUID字符串,那么我需要从数据库中使用其等同于读HEX功能。

  1. 为什么写作和与上述两种方法不同的阅读?

  2. 什么是两者之间的GUID的处理更合适的方法是什么?

Answer 1:

由于原来的海报问我的意见(这只是链接)被张贴作为一个答案,就到这里吧:

SO:在.NET的Guid字节顺序

MSDN:的System.Guid .ToByteArray交换前4个字节

SO:C#:为什么不Guid.ToString(“N”)与从相同的GUID的字节阵列产生一个十六进制字符串?

好像它没有明确记载什么字节序的不同组成部分Guid拥有,转换,并从当Byte[]



Answer 2:

尼尔森回答这个问题的一个组成部分。 至于使用哪个,没有什么,使一个很好的选择。 无论哪种方式,它的罚款。 如果在数据库中的值将需要以后在.NET世界以外的阅读,那么MySQL和兴和unhexing会更好。 有一个轻微的(非常非常小的)性能诅咒,在我的测试中unhexing相应的惩罚措施。 如果它的事项给你,然后用粘ToByteArray()



文章来源: Incorrect Guid order