MySQL中binary(16)类型Guid字段插入异常问题解决
MySQL binary(16) 类型 Guid 插入异常问题解决
问题场景
最近在处理MySQL表的Guid插入时遇到了两个棘手的问题:
- 当用参数传递Guid值插入
binary(16)类型的CustomerGuid字段时完全正常,但直接写SQL文本插入时,会抛出MySql.Data.MySqlClient.MySqlException: 'Data too long for column'错误。 - 尝试用
UNHEX(REPLACE(...))的方式去掉Guid的横杠再转换插入:
结果更糟——插入后的Guid值变成了INSERT INTO `Customer` (`CustomerGuid`) VALUES (UNHEX(REPLACE('30ec1950-c0da-4498-9aa6-685a83c74441', '-','')));5019ec30-dac0-9844-9aa6-685a83c74441,和原Guid的字节顺序完全错乱了。
对应的表结构如下:
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;
问题根源
这两个问题本质上都是Guid字节序的处理问题:
- 直接传入带横杠的Guid字符串时,字符串长度是36个字符,远超过
binary(16)能存储的16字节,所以触发“数据过长”错误。 - Guid的字符串格式是
8-4-4-4-12的十六进制结构,但它的前三个分段(8位、4位、4位)采用小端字节序,后两个分段是大端字节序。而UNHEX(REPLACE(...))只是简单地把整个字符串按顺序转成字节,没有处理字节序的反转,导致插入后的binary值和原Guid不匹配,看起来就是“错乱”了。
解决方案
使用专门处理Guid到binary转换的uuid_to_bin函数(自定义实现,处理字节序反转逻辑),就能正确完成转换。
正确的插入语句如下:
INSERT INTO `Customer` (`CustomerGuid`) VALUES (uuid_to_bin('d8faa5d2-a445-4ee3-a35d-33e7b8c68e67'));
这个函数会自动处理Guid前三个分段的字节反转,后两个分段保持原样,确保转换后的binary(16)值和原Guid的逻辑一致,插入后不会出现顺序错乱的问题。
内容的提问来源于stack exchange,提问作者Korkut Düzay
相关产品推荐
相关产品推荐

