diff --git a/lib/modules/Sql.pmod/odbc.pike b/lib/modules/Sql.pmod/odbc.pike
index 2442fa3cb537d3608c84b2d1a3bccd9bc8e1b810..bcfd1a31e513925871b804c3d89738547aa00c09 100644
--- a/lib/modules/Sql.pmod/odbc.pike
+++ b/lib/modules/Sql.pmod/odbc.pike
@@ -111,4 +111,10 @@ class typed_result
     return Calendar.ISO.Fraction(year, month, day,
 				 hour, minute, second, nanos);
   }
+
+  //! Function called to create UUID/GUID objects.
+  Standards.UUID.UUID uuid_factory(string(0..255) raw_uuid)
+  {
+    return Standards.UUID.UUID(raw_uuid);
+  }
 }
diff --git a/src/modules/Odbc/odbc_result.c b/src/modules/Odbc/odbc_result.c
index 8f1fdb18bd886f62e48dcf6cb7cabbee15be2d96..a79ba7307378af6319a8ccf83e106e420b2e707e 100644
--- a/src/modules/Odbc/odbc_result.c
+++ b/src/modules/Odbc/odbc_result.c
@@ -73,6 +73,7 @@ int odbc_typed_result_fun_num = -1;
 static int scale_numeric_fun_num = -1;
 static int time_factory_fun_num = -1;
 static int timestamp_factory_fun_num = -1;
+static int uuid_factory_fun_num = -1;
 
 /*
  * Functions
@@ -270,6 +271,11 @@ static void push_timestamp(int i)
   apply_current(timestamp_factory_fun_num, 7);
 }
 
+static void push_uuid(int i)
+{
+  apply_current(uuid_factory_fun_num, 1);
+}
+
 #ifndef SQL_SS_VARIANT
 #define SQL_SS_VARIANT		(-150)
 #endif
@@ -434,6 +440,8 @@ static void odbc_fix_fields(void)
 #ifdef SQL_GUID
     case SQL_GUID:
       push_text("uuid");
+      field_info[i].bin_size = sizeof(struct tagSQLGUID);
+      field_info[i].factory = push_uuid;
       break;
 #endif
     case SQL_DATE:
@@ -1376,6 +1384,8 @@ void init_odbc_res_programs(void)
 		       tOr(tInt, tVoid) tOr(tInt, tVoid)
 		       tOr(tInt, tVoid) tOr(tInt, tVoid), tMix),
 		 ID_PUBLIC);
+  uuid_factory_fun_num =
+    ADD_FUNCTION("uuid_factory", NULL, tFunc(tStr8, tObj), ID_PUBLIC);
 
   odbc_typed_result_program = end_program();
   odbc_typed_result_fun_num =