load data bit 类型存储 Boolean 类型问题

  • 【TiDB 版本】: V4.0.0
  • 【问题描述】:
    在TIDB的表中有BIT类型的字段,在用load data加载数据时BIT类型字段会出现‘true/false’值被null值取代的情况

一、情况描述:在TIDB和MySQL分别做测试,表结构和数据文件均一致

  1. 现有一张表bit_test,表结构下:
    CREATE TABLE bit_test (
    id int(11) DEFAULT NULL,
    SdState bit(1) DEFAULT NULL,
    State bit(1) DEFAULT NULL,
    id2 int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

  2. 数据文件内容如下:
    image

二、执行操作与结果描述:
【TIDB】

  1. 执行load命令如下:
    load data local infile ‘test.txt’ into table ods.bit_test fields terminated by ‘\t’ enclosed by ‘^’ lines terminated by ’
  2. insert命令如下:
    insert into bit_test values (7,false,true,6)
    insert into bit_test values (8,0,1,7)
  3. 执行结果如下:
    image

【MySQL】

  1. 执行load命令如下:
    load data low_priority local infile ‘test.txt’ replace into table dm.bit_test fields terminated by ‘\t’ enclosed by ‘^’ lines terminated by ’
  2. insert命令如下:
    insert into bit_test values (7,false,true,6)
    insert into bit_test values (8,0,1,7)
    3.执行结果如下:
    image

【问题描述】:从上面测试来看,在tidb中,insert命令是可以把 ‘true/flase’ 转换为bit类型的 ‘1/0’ 来入表的,但是在使用load data时bit类型字段入表的数据均为null值。现在我们这边上游给的数据文件中bit类型字段对应的数据值为true / false,我们也是通过load data加载到TIDB的表中的,发现bit类型字段全为空值。麻烦请教下是有什么参数或者配置来设置bit类型的字段入表的规则吗

感觉和这个问题比较类似,可以参考下,我们研究下,稍后答复,多谢。

好的,我试一下这个问题中的load 语法哈,多谢

抱歉,我们测试了下,这里应该是不同的问题。 在load data的时候 是把字符串’0’‘1’‘true’‘false’ 转成 bit(1) 再插入的 会出现Data too long的错误导致该字段的值为 NULL,我们看下是否有什么办法可以绕过,多谢。

好的,多谢,辛苦您了

抱歉,还在分析,如果着急的话,建议在导出的txt文档中,将true 和false改为0和1,直接导入,麻烦了,多谢。

您好,我们这边测试了下把false/true 替换成 0/1 、b’0’/b’1’ 、b’00’ / b ‘01’ 、B’0’/B’1’ 、B’00’ / B’01’ 、0b0 /0b1 、0b00/0b01 这几种方案都不可行,依然都是空值,辛苦您在帮忙看下是否有其他的方法可以入库

抱歉,没有找到合适的方法,是否可以新建一个中间表,字段修改为int,导入后,再insert到原表中?

好的,麻烦您了,我们这边将字段类型改为boolean型的,现在已经可以成功入库了,感谢您的支持,多谢!

:+1::+1::+1:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。