Guid订单不正确

时间:2012-06-24 12:43:22

标签: c# mysql hex guid connector-net

好的我有GUID f5cc4100-f1b4-4af6-9e9e-224b0eb74166我正在使用ADO .NET Connector将其插入MySQL数据库。

我可以用两种方式做到:

1)将字节数组提供给.NET Connector

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作为bytearrays插入,那么我需要像这样读取它们并转换为字节数组以获得正确的GUID。如果我将GUID作为十六进制guid字符串的UNHEX插入,那么我需要使用其等效的HEX函数从db读取。

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

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

2 个答案:

答案 0 :(得分:1)

由于原始海报要求将我的评论(这些只是链接)作为答案发布,所以它来了:

SO: Guid Byte Order in .NET

MSDN: System.Guid .ToByteArray swapping first 4 bytes

SO: C#: Why isn't Guid.ToString(“n”) the same as a hex string generated from a byte array of the same guid?

似乎没有清楚地记录Guid的不同组成部分在转换为Byte[]和从{{1}}转换时所拥有的字节顺序。

答案 1 :(得分:1)

尼尔森回答了问题的一部分。至于使用哪一种,没有什么能做出好的选择。无论哪种方式都很好。如果在.NET世界之外需要读取db中的值,那么MySQL的hexing和unhexing会更好。在我的测试中,与hexing和unhexing相关的性能损失很小(非常非常轻微)。如果对您很重要,请坚持ToByteArray()