最近在使用mysql進行excel導入的時候發現,有些字段會自動被截取,導致導入的數據與原始數據不一致。經過調查,發現是mysql默認對某些字段進行了截取。
具體表現為:
-- 創建測試表 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, `content` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- excel數據 id name content 1 test aaaaaaaaaaaaaaaaaaa 2 test2 bbbbbbbbbbbbbbbbbbb -- 導入命令 LOAD DATA LOCAL INFILE '/tmp/test.csv' INTO TABLE test CHARACTER SET utf8 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 導入后的結果 SELECT * FROM test; +----+------+----------------+ | id | name | content | +----+------+----------------+ | 1 | test | aaaaaaaaaa | | 2 | test2| bbbbbbbbbbb | +----+------+----------------+
在這個例子中,content字段被默認截取為10個字符,導致實際數據被截取了。這就需要我們在導入數據的時候注意一些細節。
可以通過以下方式解決:
-- 關閉截取 SET @@sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; -- 在導入前設置需要導入的表字段長度 ALTER TABLE test MODIFY content varchar(1000) DEFAULT NULL; -- 導入命令 LOAD DATA LOCAL INFILE '/tmp/test.csv' INTO TABLE test CHARACTER SET utf8 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 恢復sql_mode SET @@sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
通過這種方式,就可以關閉字段截取,同時在導入前設置好表字段長度,避免數據被截取。