1

我正在使用制表符分隔文件将数据插入 MySql 数据库

在位字段中,我得到 0 和 1 作为值,但是当我使用下面的命令将数据插入数据库时​​,它会将 0 转换为 1。

load data local infile 'c:/membership.txt' into table membership;

结果,位列在每一行中的值为 1。

表的结构是

       Create table Membership
    (
    MemberShipId int not null AUTO_INCREMENT, 
StartDate datetime not null, 
EndDate datetime not null, 
AgeGroup tinyint, 
Newsletter bit, 
Donation decimal(7,2), 
FavouriteShow varchar(50), 
Comments varchar(200), 
MemberId int not null, 
PRIMARY KEY (MemberShipId),
CONSTRAINT fk_Member FOREIGN KEY (MemberId) REFERENCES Member (MemberId)
    );

样本输入是

1   2012-01-01  2012-01-01  0   0   \N  \N  1
2   2012-01-01  2012-01-01  1   0   \N  \N  2
3   2012-01-01  2012-01-01  1   0   \N  \N  3
4   2012-01-01  2012-01-01  1   0   \N  \N  4
5   2012-01-01  2012-01-01  0   0   \N  \N  5
6   2012-01-01  2012-01-01  0   0   \N  \N  6
4

2 回答 2

1

MySql 文档似乎涵盖了这个问题: http ://dev.mysql.com/doc/refman/5.6/en/load-data.html

在以以下开头的部分查看页面的大约一半:

无法使用二进制符号加载 BIT 值...

描述了一个有点笨拙的解决方法。

于 2013-02-28T21:49:30.847 回答
1

导入 CSV 文件时,您的值似乎被隐式引用为字符串。在 MySQL 5.0.3 之后使用BIT类型时,它旨在作为位字段(例如 '11001'),而不是布尔类型 1/0。字符串值'0''1'两者似乎都被解释为非空数据,而且你不只是得到一个 0。

相反,您可以使用仅支持数值 1 或 0的TINYINT(1)类型或其同义词。BOOLEAN

Create table Membership
(
  MemberShipId int not null AUTO_INCREMENT, 
  StartDate datetime not null, 
  EndDate datetime not null, 
  AgeGroup TINYINT,
  /* use TINYINT(1) for a boolean  OR use BOOLEAN */ 
  Newsletter TINYINT(1), 
  Donation decimal(7,2), 
  FavouriteShow varchar(50), 
  Comments varchar(200), 
  MemberId int not null, 
  PRIMARY KEY (MemberShipId),
  CONSTRAINT fk_Member FOREIGN KEY (MemberId) REFERENCES Member (MemberId)
);
于 2012-07-10T02:16:43.940 回答