我的表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'));
答案 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
显然,如果您的读写代码不一致:发生了不好的事情。