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

1szpjjfi  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(314)

我的表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'));
jgzswidk

jgzswidk1#

首先,请注意,您现有的代码可能是“right”,因为“right”的某些值是“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[] ,这是很难争论的顺序。
具体来说,guid:

00112233-4455-6677-8899-aabbccddeeff

可以编码为大端:

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

或混合endian:

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

显然,如果你的读写代码不一致:坏事就会发生。

相关问题