【问题标题】:MySql insert statement to binary datatype?MySql将语句插入二进制数据类型?
【发布时间】:2021-10-28 08:37:25
【问题描述】:

我正在使用 MySQL 数据库。

我有一张表,其列的数据类型为 binary(16)。

我需要有关此表的插入语句的帮助。

Example:
CREATE TABLE `assignedresource` (
`distid` binary(16) NOT NULL
)

insert into assignedresource values ('9fad5e9e-efdf-b449');

Error : Lookup Error - MySQL Database Error: Data too long for column 'distid' at row 1

如何解决这个问题?

【问题讨论】:

  • 您正尝试将 18 个字节插入 16 字节字段。你期待什么?如何修复 - 插入更少的字节。

标签: mysql sql


【解决方案1】:

您应该删除连字符以使值与字段的长度匹配...

Example:
CREATE TABLE `assignedresource` (
`distid` binary(16) NOT NULL
)

insert into assignedresource values ('9fad5e9eefdfb449');

另外,MySQL 标准是使用这种表示法将字符串表示为二进制... X'9fad5e9eefdfb449',即

insert into assignedresource values (X'9fad5e9eefdfb449');

【讨论】:

  • 我想我应该注意每两个字符代表一个二进制字节。所以我相信有问题的字符串(在删除破折号之后)是二进制(8)。
【解决方案2】:

好吧,假设您要严格插入一个十六进制字符串,首先您需要删除破折号,然后“取消十六进制”您的字符串,然后再将其插入二进制文件(16) 数据类型列,代码如下:

INSERT INTO `assignedresource` VALUES(UNHEX(REPLACE('9fad5e9e-efdf-b449','-','')));

另外......您插入的 “可用” 数据实际上是 8 字节undashing 之后,所以 binary( 8) 如果您打算不存储破折号,那会很好。

【讨论】:

    【解决方案3】:

    您可以去掉连字符并将 0x 附加到未引用的值上,如下所示:

    insert into assignedresource values (0x9fad5e9eefdfb449);
    

    以及,就像这个(在其他答案中提到的):

    insert into assignedresource values (X'9fad5e9eefdfb449');
    

    两者都是hexadecimal literal 的有效表示法。

    【讨论】:

      【解决方案4】:

      您的字符串是 18 字符长,请更改数据库

      CREATE TABLE `assignedresource` (
      `distid` binary(18) NOT NULL
      )
      

      【讨论】:

      • mysql 中的字符串不是以 null 结尾的吗(需要 19 个字节)?
      • AFAIK,MySQL 不关心 null 终止。所以这是客户端转换的问题。但没有什么能阻止存储所有 19 个字节并指向客户端的原始数据。
      猜你喜欢
      • 2014-11-01
      • 2010-11-10
      • 2010-12-17
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2021-06-13
      • 2013-10-15
      相关资源
      最近更新 更多