我从Oracle数据库中将整个表导出,并将所有值都导出到txt文件中-一列包含浮点值,格式为' 1,5 '或' 0,25 < / strong>”或“ 0,75 ”,等等(=工作时间)。 我连接了mariadb数据库,试图将txt文件导入到我在mariadb数据库中创建的新表中。
我的显示创建表在表' working_hours '中显示了此表,其中包含浮点值:
CREATE TABLE work (working_hours FLOAT)engine=innodb default charset=utf8
collate=utf8_bin;
导入如下:
LOAD DATA LOCAL INFILE '/var/www/foldername/import.txt' INTO TABLE work
CHARACTER SET latin1 FIELDS TERMINATED BY '\t' LINES TERMINATED BY
';\n'(working_hours);
导入将不会存储浮点值,但会切断整数旁边的所有内容。因此,“ 1,5”将被存储为“ 1”,“ 0,25”将被存储为“ 0”,依此类推。 我想保留格式'n,m'而不是'n.m',我想使用浮点值来计算(每月多少工作时间?) 当我也使用VARCHAR时也可以计算总和吗? 我在互联网上找不到任何可行的解决方案,在将float值转换为varchar之前,我想知道在我的情况下这是否有意义。
感谢您的建议和帮助!
答案 0 :(得分:1)
MySQL不支持,
作为十进制分隔符。
https://dev.mysql.com/doc/refman/8.0/en/number-literals.html说:
数字可能包括。作为小数点分隔符。
如果要使用数字数据类型或计算总和或其他算术表达式,则必须使用.
。
答案 1 :(得分:1)
正如@BillKarwin指出的那样,MySQL不支持,
作为十进制分隔符。因此,要将数字存储在数据库中,您需要对其进行转换。几乎可以肯定这是必要的,因为对存储为VARCHAR的浮点数进行比较不一定有效-在字符串比较中,'9'
为> '19'
。
执行此操作最简单的方法可能是将数据读取到临时表中,然后将其复制到work
表中,然后将其转换为浮动状态。您可以通过以下方式做到这一点:
CREATE TEMPORARY TABLE w1 (working_hours VARCHAR(20));
LOAD DATA LOCAL INFILE '/var/www/foldername/import.txt' INTO TABLE w1
CHARACTER SET latin1 FIELDS TERMINATED BY '\t' LINES TERMINATED BY
';\n'(working_hours);
INSERT INTO work SELECT 0.0 + REPLACE(working_hours, ',', '.') FROM w1;
DROP TABLE w1
通过对,
进行反向替换,即始终可以将包含SELECT
的值显示为小数分隔符。
SELECT REPLACE(working_hours, '.', ',') AS working_hours