将文本作为guid插入二进制文件(16)

时间:2018-05-17 11:14:30

标签: c# mysql .net

我的表guid列类型二进制(16)。
使用参数发送guid值时没问题 但我发送guid值作为sql文本,我收到一个错误(MySql.Data.MySqlClient.MySqlException:'数据太长了列)。

INSERT INTO `Customer` (`GuidId`) VALUES ('30ec1950-c0da-4498-9aa6-685a83c74441');

我尝试过以下但是这次它已损坏

INSERT INTO `Customer` (`CustomerGuid`) VALUES (UNHEX(REPLACE('30ec1950-c0da-4498-9aa6-685a83c74441', '-','')));

我的价值:'30ec1950-c0da-4498-9aa6-685a83c74441'
插入值:'5019ec30-dac0-9844-9aa6-685a83c74441'

如何以正确的方式添加?

表:

CREATE TABLE Customer
(
    customerid int(11) NOT NULL AUTO_INCREMENT,
    customerguid binary(16) DEFAULT NULL,
    firstname varchar(50) DEFAULT NULL,
    lastname varchar(50) DEFAULT NULL,
    createddate datetime DEFAULT NULL,
    PRIMARY KEY (customerid),
    KEY ix_tmp_autoinc (customerid)
)
ENGINE=InnoDB
AUTO_INCREMENT=34
DEFAULT CHARSET=utf8;

解决方案:

https://gist.github.com/IcyMidnight/159151

此问题通过此链接上的功能解决。两个功能正常工作。

INSERT INTO `Customer` (`CustomerGuid`) VALUES (uuid_to_bin('d8faa5d2-a445-4ee3-a35d-33e7b8c68e67'));

1 个答案:

答案 0 :(得分:1)

首先,请注意您的现有代码可能是“正确的”,对于“right”的某些值。可能只是你用来读取guid的代码在编码布局上不一致。

我建议使用参数并发送guid 本身,或者(最好):发送byte[]。例如:

INSERT INTO `Customer` (`GuidId`) VALUES (@val);

Guid guid = ...
cmd.Parameters.AddWithValue("@val", guid);

Guid guid = ...
byte[] bytes = (your choice of encoding of guid)
cmd.Parameters.AddWithValue("@val", bytes);

重要的是,请注意guid编码不明确。有两种常用的格式具有不同的布局,因此了解guid的每个部分应该最终的位置是非常重要的。更糟糕的是:不同的ADO.NET提供商和RDBMS 不同意 - 因此最可靠的方法是在byte[]中进行通话,而不是Guid。一旦数据为byte[],就很难争论订单。

具体来说,指南:

00112233-4455-6677-8899-aabbccddeeff

可以编码为 big-endian:

00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff

mixed-endian:

33 22 11 00 55 44 77 66 88 99 aa bb cc dd ee ff

显然,如果您的读写代码不一致:发生了不好的事情。