GUIDがf5cc4100-f1b4-4af6-9e9e-224b0eb74166
あり、ADO.NETコネクタを使用してMySQLデータベースに挿入しています。
私は2つの方法でそれを行うことができます:
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標準関数を使用して、16進数を2進数の文字列に変換します。
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();
}
私が直面している問題は、上記の2つの方法で、同じ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を取得する必要があります。また、16進数のGUID文字列の時点でGUIDを挿入する場合はUNHEX
、同等の関数を使用してdbから読み取る必要がありHEX
ます。
上記の2つの方法で書き込みと読み取りが異なるのはなぜですか?
2つの間でGUIDを処理するためのより適切な方法は何でしょうか?