Неверный заказ Guid

Хорошо у меня есть GUID f5cc4100-f1b4-4af6-9e9e-224b0eb74166 и я вставляю его в базу данных MySQL с помощью ADO .NET Connector.

Я могу сделать это двумя способами:

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();
}

Проблема, с которой я сталкиваюсь, состоит в том, что два вышеупомянутых метода вставляют одну и ту же направляющую в немного другом порядке символов.

Если я выбираю обратно вставленный гид, как это:

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 функция.

  1. Почему написание и чтение по-разному с двумя вышеупомянутыми методами?

  2. Что было бы более подходящим способом обработки GUID между двумя?

2 ответа

Решение

Так как оригинальный постер попросил опубликовать мои комментарии (которые являются просто ссылками) в качестве ответа, вот оно:

SO: Порядок байтов в.NET

MSDN: System.Guid.ToByteArray поменять местами первые 4 байта

SO: C#: Почему Guid.ToString("n") не совпадает с шестнадцатеричной строкой, сгенерированной из байтового массива того же guid?

Похоже, что не ясно задокументировано, какие порядковые номера используются в различных компонентах Guid владеть, при конвертации в и из Byte[],

Нильсен отвечает на одну часть вопроса. Что касается использования, нет ничего, что делает хороший выбор. В любом случае это нормально. Если значения в БД необходимо будет прочитать позже за пределами мира.NET, то лучше будет использовать шестнадцатеричное и шестнадцатеричное MySQL. В моих тестах есть небольшое (очень очень небольшое) снижение производительности, связанное с зашифровыванием и разглаживанием. Если это важно для вас, то придерживайтесь ToByteArray()

Другие вопросы по тегам