8

可能重复:
我应该如何在 MySQL 表中存储 GUID?


VARCHAR将返回,因为string
BLOB将返回,byte[]
但是,MySQL 的哪种列类型将在 C# 中返回为System.Guid
, 谢谢。 编辑:感谢 DaveHogan,

我找到了答案,它为我提供了有关 ORM(对象关系映射)的线索, 我开始寻找有关 Connector/NET 进行的数据类型转换(映射)的信息。我正在使用 MySQL Dot Net Connector (Connector/NET) ,Connector/NET 执行不同的 3 种情况。 以下是我发现的:第一种情况:从连接器 /NET 6.1.1 开始,CHAR(36)将在 C# 和BINARY(16)中自动转换为 System.GUID








将被视为 System.Byte[]。

第二种情况:
如果您使用较旧的连接器/NET,当值传递到 C# 时, BINARY(16)将自动转换为 System.GUID,而CHAR(36)将被视为 System.String。

第三种情况:
如果您使用较新的 Connector/NET(比 6.1.1 更新),并且如果您想使用BINARY(16) AS System.GUID(默认情况下不是),则必须添加连接选项Old Guids=在连接字符串中为真。
例子:

服务器=本地主机;用户=root;密码=qwerty;数据库=测试;旧 guids=true;

这样,CHAR(36)将被转换为 System.String 和BINARY(16) = System.GUID

阅读更多关于旧 Guid的连接选项的信息:
​​MySQL 5.6 参考手册:21.2.6。连接器/网络连接字符串选项参考

------------------------------------------- ---------------
额外信息:
如何将 System.GUID 插入 MySql 数据库
----------- -------------------------------------------------- ---------
这是一个示例表,我们将插入 System.GUID:

创建表`testdata`(
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `binary` binary(16) 默认为 NULL,
  `char` char(36) 默认为空,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=1 默认字符集=utf8

将 System.GUID 插入 MySQL

string constr = "server=localhost;user=root;pwd=qwerty;database=test;";
使用 (MySqlConnection conn = new MySqlConnection(constr))
{
    conn.Open();

    // 创建一个 System.GUID
    字节[] ba = 新字节[16];
    随机 rd = new Random();
    rd.NextBytes(ba);
    System.Guid guid = new Guid(ba);

    // 以 SQL 格式准备 GUID 值
    字符串 guidForChar36 = guid.ToString();
    字符串十六进制字符串 = BitConverter.ToString(guid.ToByteArray());
    字符串 guidForBinary16 = "0x" + hexstring.Replace("-", string.Empty);

    string sql = "插入测试数据(`binary`,`char`)"
               + "值(" + guidForBinary16 + ","
               + "'" + guidForChar36 + "');";

    MySqlCommand cmd = new MySqlCommand(sql, conn);
    cmd.ExecuteNonQuery();

    conn.Close();
}
4

2 回答 2

3

编辑:

对不起,我误解了你的问题。你应该使用

BINARY(16)

如何将其转换为 System.Guid 取决于您是否使用 ORM 等。

于 2012-10-19T14:25:17.163 回答
0

CHAR(16) 如果您想最优化地利用存储空间,您可以将 guid 用作二进制文件。或使用char(36)

于 2012-10-19T14:28:30.000 回答