我的表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条答案
按热度按时间jgzswidk1#
首先,请注意,您现有的代码可能是“right”,因为“right”的某些值是“right”。可能只是因为您用来读取guid的代码与编码布局不一致。
我建议使用参数并发送guid本身,或者(最好):发送
byte[]
. 例如:具有
或
重要的是,注意guid编码是不明确的。有两种常用的格式具有不同的布局,因此了解guid的每个部分应该在哪里结束非常重要。更糟的是:不同的ado.net提供程序和rdbms不一致-因此最可靠的方法是在
byte[]
,不是Guid
. 一旦数据是byte[]
,这是很难争论的顺序。具体来说,guid:
可以编码为大端:
或混合endian:
显然,如果你的读写代码不一致:坏事就会发生。