我正在尝试获得将guid存储为主键的最优化方法,它是二进制的(16),但是能够在mysql工作台查询中将二进制值视为文本。mssql让这变得简单,为什么mysql不行?
我创建了一个名为“hosts”的表,其中主键是一个名为“systemid”的字符(16)。看看别人的例子,不知道哪里不对。
为什么会出现错误:
对于第1行的列“systemid”,数据太长
我的测试asp.net方法如下所示:
[HttpGet("add")]
public ActionResult<string> Add([FromQuery(Name = "systemid")] Guid systemID)
{
//https://localhost:44344/api/hostresolver/add?systemid=D3DDCAC9-7DAD-44DF-AD5E-7F9F10AA0EF3
using (var connection = new MySqlConnection(DBSettings.connectionString))
{
try
{
connection.Open();
var data = new byte[255];
string sql = "INSERT INTO hosts VALUES(?SystemID, ?TrackingID)";
using (var cmd = new MySqlCommand(sql, connection))
{
cmd.Parameters.Add("?SystemID", MySqlDbType.Guid).Value = systemID;
cmd.Parameters.Add("?TrackingID", MySqlDbType.Binary, 255).Value = data;
return rowsEffected != 0 ? "Success" : "Failed";
}
}
catch (Exception e)
{
return e.Message;
}
connection.Close();
}
return "Failed";
}
自 Guid.NewGuid().ToByteArray()
产生16个字节,我希望它适合char(16)。
将密钥更改为 MySqlDbType.Binary
并将其值设置为 systemID.ToByteArray()
在mysql工作台中执行查询时,我看不到systemid值是多少。我应该能够使用字符(16),但它不工作。
也许我应该用“宾至如归”?
2条答案
按热度按时间w9apscun1#
默认情况下,connector/net将guid存储为
CHAR(36)
. 如果要将它们存储为16字节,则需要将列类型更改为BINARY(16)
并设置OldGuids=true
在连接字符串中。从连接选项:
guid类型的后端表示形式已从更改为
BINARY(16)
至CHAR(36)
. 这样做是为了允许开发人员使用服务器功能UUID()
要填充guid表-UUID()
生成36个字符的字符串。注意如果你这么做
BINARY(16)
数据库中的列将作为System.Guid
. 如果这是不可取的,你应该坚持默认值CHAR(36)
接近。如果您需要更大的灵活性,mysqlconnector(另一个ado.net mysql库)支持
GuidFormat
选项,包括Char36
,Binary16
,和LittleEndianBinary16
.m0rkklqb2#
您可以将数据类型更改为
LONGTEXT
或者更好char(16)
甚至binary(16)
.