好吧,我有一个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作为ByteArray对象,然后我需要阅读它们的方式和强制转换为字节数组,以获得正确的GUID。 如果我插入GUID作为UNHEX
十六进制GUID字符串,那么我需要从数据库中使用其等同于读HEX
功能。
为什么写作和与上述两种方法不同的阅读?
什么是两者之间的GUID的处理更合适的方法是什么?