在MySQL下指令匯入資料初體驗
因為開始使用Docker的關係現在玩系統跟資料庫變得簡單多了,這兩天嘗試把玩MySQL資料庫,但在做匯入資料時卻發生一些障礙,趕緊把過程筆記起來避免日後遺忘:)
先來看目前的p1這個資料表結構
mysql> desc p1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| q1 | varchar(50) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)嘗試下指令把csv檔案匯入mysql但卻發生錯誤
USE lab;
LOAD DATA LOCAL INFILE '/123/01.csv'
INTO TABLE p1
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;錯誤訊息內容如下
ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides
mysql> show variables like 'local_infile';查了一下是預設本地檔案沒有啟用的關係
mysql> show variables like 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | OFF |
+---------------+-------+
1 row in set (0.01 sec)下指令去啟用一下
mysql> SET GLOBAL local_infile=1;
Query OK, 0 rows affected (0.00 sec) 然後嘗試再匯入但還是一樣有錯 Orz
mysql> LOAD DATA LOCAL INFILE '/123/01.csv'
-> INTO TABLE p1
-> CHARACTER SET UTF8
-> FIELDS TERMINATED BY ','
-> ENCLOSED BY '"'
-> LINES TERMINATED BY '\n'
-> IGNORE 1 ROWS;
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.根據錯誤訊息繼續查,得知要在登入mysql時就要指定參數
mysql -u root -p --local-infile然後重新登入mysql在匯入一次就可以了
mysql> LOAD DATA LOCAL INFILE '/123/01.csv'
-> INTO TABLE p1
-> CHARACTER SET UTF8
-> FIELDS TERMINATED BY ','
-> ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n'
-> IGNORE 1 ROWS;
Query OK, 5945 rows affected, 1 warning (0.12 sec)
Records: 5945 Deleted: 0 Skipped: 0 Warnings: 1確認一下筆數資料,確實資料真的有匯入
mysql> select count(*) from p1;
+----------+
| count(*) |
+----------+
| 5945 |
+----------+
1 row in set (0.01 sec)參考資料