c# - 引导顺序不正确

标签 c# mysql hex guid connector-net

好的,我有一个 GUID f5cc4100-f1b4-4af6-9e9e-224b0eb74166,我正在使用 ADO .NET 连接器将其插入到 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 作为字节数组插入,那么我需要按原样读取它们并将其转换为字节数组以获得正确的 GUID。如果我将 GUID 作为十六进制 GUID 字符串的 UNHEX 插入,那么我需要使用其等效的 HEX 函数从数据库中读取数据。

  1. 为什么上面两种方法的写入和读取不同?

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

最佳答案

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

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[] 相互转换时所拥有的字节顺序。

关于c# - 引导顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11177514/

相关文章:

c# - 非根对象的 JSON 反序列化

c# - 如何将 Entity Framework 查询写成 **like 'lap%' **

mysql - 检索 MySQL 中的下一行

java 将十六进制 NCR 文本转换为 unicode 字符

c# - 无法加载文件或程序集 'microsoft.sqlserver.batchparserclient'

c# - 当一个事件有多个订阅者时,如何获取每个订阅者的返回值?

mysql - 错误 1064 (42000) : You have an error in your SQL syntax;

MySQL Join 使用 WHERE 子句返回太多行

hex - 国际象棋棋盘人口

c# - 如何将十六进制颜色转换为 RGB 颜色(24 位)