在mysql中最佳存储guid:“data too long for column”,即使它应该适合char(16)

li9yvcax  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(320)

我正在尝试获得将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),但它不工作。
也许我应该用“宾至如归”?

w9apscun

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 .

m0rkklqb

m0rkklqb2#

您可以将数据类型更改为 LONGTEXT 或者更好 char(16) 甚至 binary(16) .

相关问题