使用“加载文件数据”时将真假字符串转换为布尔值
Posted
技术标签:
【中文标题】使用“加载文件数据”时将真假字符串转换为布尔值【英文标题】:converting true false string to boolean while using "load infile data" 【发布时间】:2013-07-11 07:19:18 【问题描述】:我需要将数据从 MSSQL (Microsoft SQL Server) 传输到 mysql,对我来说最好的选择是编写一个 python 脚本,将数据从 MSSQL 导出为 csv,然后将此 csv 导入 mysql。到目前为止,这个过程对我来说效果很好(我不是在寻找其他方法来做到这一点)。
从 MSSQL 到 MySQL 的数据类型转换是这样完成的:
MSSQL_MySQL_MAP =
'nvarchar' : 'varchar',
'varchar' : 'varchar',
'bit' : 'boolean',
'smallint' : 'smallint',
'int' : 'int',
'datetime' : 'datetime',
'timestamp' : 'datetime',
'ntext' : 'longtext',
'real' : 'double',
'image' : 'BLOB',
'float' : 'float',
'money' : 'decimal',
使用以下命令将导出的 csv 导入 MySQL..
"""LOAD DATA INFILE '%s/%s' REPLACE INTO TABLE %s FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'"""
我有一种情况,MSSQL 中有一个“位”数据类型,导出的 CSV 包含一个 True of False 字符串,如下所示:
22294,501,q4h,12 ,False,False,None,False,None,None,None,0,None,None
让 MySQL 了解 True 或 False 字符串是布尔值 1 或 0 并正确导入它的最佳方法是什么?目前,我收到以下警告:
Warning: Incorrect integer value: 'False' for column 'system_code' at row 7
有没有办法传递一些参数以及可以完成此操作的加载文件数据?
【问题讨论】:
如果您不能将 CSV 文件更改为包含字符串 'False' 以外的其他内容,那么 eggyal 概述的方法是获取 LOAD DATA 命令进行翻译的唯一方法。 @spencer7593:我不会说 only 方式...例如,还可以将数据加载到具有字符串类型列的临时表中,然后使用INSERT ... SELECT
复制翻译后的数据。
@eggyal:你当然是对的。但至于让LOAD DATA
语句从 .CSV 文件中读取“False”和“True”的字符串值并将其作为 0 或 1 插入到 tinyint 列中,这是我知道的唯一方法工作是用一个表达式,比如在你的例子中,虽然为了未来读者的利益,我会倾向于写SET col = IF(@var1='False',0,1)
【参考方案1】:
如LOAD DATA INFILE
Syntax 中所述:
默认情况下,当
LOAD DATA INFILE
语句末尾没有提供列列表时,输入行应包含每个表列的字段。如果您只想加载表格的某些列,请指定列列表:LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
如果输入文件中字段的顺序与表中的列顺序不同,您还必须指定列列表。否则,MySQL 无法判断如何将输入字段与表列匹配。
列列表可以包含列名或用户变量。对于用户变量,
SET
子句允许您在将结果分配给列之前对其值执行转换。
SET
子句中的用户变量可以以多种方式使用。下面的例子直接将第一列输入为t1.column1
的值,并将第二列赋值给一个用户变量,该用户变量在用于t1.column2
的值之前进行了除法运算:LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1) SET column2 = @var1/100;
在您的情况下,您可以执行SET boolean_column := @dummy_variable = 'True'
之类的操作。
【讨论】:
我的想法是一样的——dummy_variable 的条件语句是什么样的?本质上,如果为 False,我需要 dummy_variable 为 0,如果为 True,则为 1 @Trewq:“在你的情况下,你可以做类似SET boolean_column := @dummy_variable = 'True'
的事情。”
这是否会强制 dummy_variable 始终为真?这也可能是错误的。
@Trewq:啊,不。相当令人困惑的是,MySQL 的=
运算符根据上下文同时用于assignment 和equality comparison。在上面的上下文中,它是相等比较,如果操作数相等则返回1
,否则返回0
(这正是你想要的快捷方式)。
@Trewq:相当于IF(@dummy_variable='True',1,0)
。以上是关于使用“加载文件数据”时将真假字符串转换为布尔值的主要内容,如果未能解决你的问题,请参考以下文章
将 0 和 1 (float64) 转换为布尔值时将空值转换为 True [重复]
使用泛型和简单地将字符串值转换为枚举时将字符串值转换为枚举时的混淆