首页 > 解决方案 > MySQL:使用 LOAD DATA 时压缩一列中的数据

问题描述

在 MySQL 数据库中,我使用BLOB字段来存储来自可能很长的文本字符串的一些压缩数据,有时我希望向我的 Web 应用程序的用户显示这些数据,但这些数据永远不会被用于搜索或任何东西,基本的想法是保存在磁盘空间上。

我正在尝试使用LOAD DATAtsv 文件填充我的表。问题是,我正在使用包含textBLOB的表格文件,但是需要压缩其中一列(那一列)。

我尝试了以下方法,但没有成功。在此示例中,table_name.tsvtsv 文件包含我要插入的数据table_name,而我要压缩的文本在 columns 中col4

mysql -h <host> -u <user> -p <pwd> <db_name>  --execute="LOAD DATA LOCAL INFILE 'table_name.tsv' INTO TABLE table_name(col1, col2, col3, @col4_comp_data) SET col4=COMPRESS(@col4_comp_data) FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n' IGNORE 1 LINES; SHOW WARNINGS"

我得到的错误是:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' IGNORE 1 LINES' at line 1

知道是否可以在加载数据时压缩数据LOAD DATA

标签: mysqlcsvblob

解决方案


您的语法顺序错误。
LINES TERMINATED BY '\\n' IGNORE 1 LINES部分需要在列设置部分之前。

正确的顺序是

BNF(巴科斯-瑙尔形式)代码

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT},
        [, col_name={expr | DEFAULT}] ...]

来源http://dev.mysql.com/doc/refman/8.0/en/load-data.html


推荐阅读