好的,我有一个 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-224b0eb74166
来回0041ccf5-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-224b0eb74166
和f5cc4100-f1b4-4af6-9e9e-224b0eb74166
。
简而言之,如果我将 GUID 作为字节数组插入,那么我需要照此读取它们并转换为字节数组以获得正确的 GUID。如果我将 GUID 作为UNHEX
十六进制 guid 字符串插入,那么我需要使用其等效HEX
函数从 db 中读取。
为什么上述两种方法的写作和阅读不同?
在两者之间处理 GUID 的更合适的方法是什么?