Я использую продукт Devart DotConnect для подключения приложения .net к базе данных MySQL. Все работает довольно хорошо, но у меня возникла проблема при работе с SQL в базе данных.
Приложение использует Guids для идентификаторов строк в базе данных (изначально исходящих из приложения SQL Server), которые хранятся в базе данных как BINARY(16) (и используют класс DevArt MySQLGuid при доступе через приложение .net)
Проблема в том, что когда я хочу запросить в базе данных определенную строку, я не могу просто вставить строковое представление GUID в базу данных, поэтому я пытаюсь разработать функцию для преобразования двоичного представления GUID к строке.
Сначала я думал, что будет достаточно просто вызвать HEX(id) в запросе, а затем, если мне нужен дружественный читаемый вывод, все, что мне нужно сделать, это добавить - в соответствующем месте.
Оператор select может выглядеть так (на практике я бы обернул его как функцию):
LOWER(CONCAT(LEFT(HEX(theme_id), 8), '-', MID(HEX(theme_id), 9,4), '-', MID(HEX(theme_id), 13,4), '-', MID(HEX(theme_id), 17,4), '-', RIGHT(HEX(theme_id), 12)))
не возвращает правильный GUID. Например, если я сохраняю d1dfd973-fa3d-4b90-a1eb-47217162cd40
, то приведенный выше оператор выбора возвращает 73d9dfd1-3dfa-904b-a1eb-47217162cd40
Похоже, что порядок первых 8 байтов в группе был обратным (взяв первую часть строки GUID, мы имеем 73d9dfd1
, что с точки зрения порядка байтов (т. е. обработки групп из двух символов как одного байта) равно d1dfd973
, то есть правильный выход.
Мой вопрос таков: есть ли операция, которую я могу выполнить в диалекте SQL MySQL, которая позволит мне изменить порядок байтов соответствующих разделов? Я мог бы сделать более сложный оператор LEFT/MID/RIGHT, но мне кажется, что это не лучший способ.
Предложения будут очень признательны.