mysql中的數據導入與導出


視頻彙總首頁:http://edu.51cto.com/lecturer/index/user_id-4626073.htmlhtml


爲了普及mysql的基本知識,特地弄了這個章節,主要是發現第一次接觸的人都不知道怎麼弄,或者看不懂,因此這裏就詳細說下吧mysql

============================================================linux

數據導入sql

1.mysqlimport命令行導入數據服務器

在使用mysqlimport命令導入數據時,數據來源文件名要和目標表一致,不想改文件名的話,能夠複製一份建立臨時文件,示例以下。網絡

創建一個文本users.txt,內容以下:ide

wKiom1VG8VvyJSnwAAB6YYoyAIw669.jpg


建立一個表usersspa

wKioL1VG8q_hcDpfAACUWsehht4443.jpg

使用mysqlimport將users.txt中數據導入users表命令行

PS F:\> mysqlimport -u root -p123456 zz --default-character-set=gbk --fields-terminated-by=',' f:\users.txtzz.users: Records: 3  Deleted: 0  Skipped: 0  Warnings: 0-----------------------------驗證----------------------------------mysql> select * from users\G*************************** 1. row ***************************
   id: 1003
 name: 王五
email: wangwu@163.com*************************** 2. row ***************************
   id: 1001
 name: 張三
email: zhangsan@163.com*************************** 3. row ***************************
   id: 1002
 name: 李四
email: lisi@hotmail.com

分列,使用--fields-terninated-by參數來指定每列的分隔符,例如:code

wKiom1VG8ZexZtkoAAFBhQ7oYUg243.jpg

若是列值中出現了分隔符,例如 1004"#李#白"#"libai@hotmail.com"

PS F:\> mysqlimport -u root -p7758520 zz  --fields-terminated-by='#' --fields-enclosed-by=\"  f:\users.txt

若是遇到一條記錄有多行,則可使用--lines-terminated-by=name來指定行的結束符

PS F:\> mysqlimport -u root -p7758520 zz  --fields-terminated-by='#' --fields-enclosed-by=\"  --lines-terminated-by='xxx\n' f:\users.txt

2.使用Load Data語句導入數據

Load Data 語句的使用語法以下:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_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,...)]
    [SET col_name = expr,...]

剛開始看到這個語法嚇了一跳,這麼長,其實沒這麼複雜,通常只需記住LOAD DATA INFILE file_name INTO TABLE tb_name這個便可,示例:

首先建立一個表sql_users,利用上面的users表複製一下

mysql> create table sql_users as select * from users;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> truncate table sql_users;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from sql_users;
Empty set (0.00 sec)

文本sql_users.txt

1004#李白#libai@hotmail.com
1005#杜牧#dumu@hotmail.com
1006#杜甫#dufu@hotmail.com
1007#蘇軾#sushi@hotmail.com

利用LOAD DATA INFILEE語句導入數據

mysql> load data infile 'f:\sql_users.txt' into table sql_users fields terminated by '#';
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from sql_users;
+------+------+--------------------+
| id   | name | email              |
+------+------+--------------------+
| 1004 | 李白 | libai@hotmail.com
| 1005 | 杜牧 | dumu@hotmail.com
| 1006 | 杜甫 | dufu@hotmail.com
| 1007 | 蘇軾 | sushi@hotmail.com  |
+------+------+--------------------+
4 rows in set (0.00 sec)

 若是在導入數據時,遇到字符串沒法識別時,通常都是字符集有問題,使用charset選項便可解決

mysql> load data infile 'f:\sql_users.txt' into table sql_users  fields terminated by '#';
ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xB0\xD7' for column 'name' at row 1--------------------------------字符集不同-----------------------mysql> load data infile 'f:\sql_users.txt' into table sql_users  character set gbk fields terminated by '#';
Query OK, 4 rows affected (0.03 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

LOAD DATA INFILE命令默認要導入數據存放在服務上,若是要導入客戶端的數據,能夠指定LOCAL,那麼mysql將從客戶端讀取數據,這樣的方式會比服務器上操做要慢一點,由於客戶端的數據須要經過網絡傳輸到服務器。

mysql> load data local infile 'f:\sql_users.txt' into table sql_users  fields terminated by '#';

若是須要忽略與主鍵值重複的記錄值或者替換重複值,可使用IGNORE或REPLACE選項,可是LOAD DATA INFILE命令語法中有兩處IGNORE關鍵字,前面一個是用來此功能的,後面一個用來指定須要忽略的前N條記錄。

wKiom1VG8e3jvNrVAAInfPim2Hc600.jpg

若是不想導入數據文件的前N行,使用IGNORE N LINES來處理

wKioL1VG84CjiNb_AAGOj2zGNhE857.jpg

若是在數據文件中記錄行頭有某些字符,又不想被導入,可使用LINES STARTING BY來解決,可是若是某行記錄不包含這些字符的話,那麼這行記錄也會被忽略。

wKiom1VG8jLAEhrBAAJO-qUkBb0151.jpg

數據文件爲Excel文件的處理,首先將Excel文件保存爲CSV格式,這樣字段間都是用逗號隔開的,再進行處理。

wKioL1VG87_hEyfXAAJH9ojE6Ec208.jpg

數據文件列值中有特殊符號,使用enclosed by來處理。例如,列值中有分隔符

wKioL1VG893ya5IFAAI8hvPpk3E453.jpg

數據導入時換行符的問題,在上面的示例中,有幾個數據導入到表中後,查詢時結果顯示有點彆扭,不知你們注意到了沒。

在Windows系統中,文本格式的換行符有"\r+\n"組成,而在linux系統中,換行符是"\n"。所以出出現上述問題,解決方法就是指定換行符LINES TERMINATED BY。

mysql> LOAD DATA INFILE 'F:\stu.csv' INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

表的列數多餘數據文件中的列數,解決方法就是指定要導入到表的字段,以下所示

wKiom1VG8pPBmfY6AAKwc3y6i-E654.jpg

若是是表的列數少於數據文件中的列數呢,解決辦法能夠指定用戶變量來接收多餘的列值,以下

wKioL1VG9CKBG5RVAAI02wZwTwA553.jpg

若是表的列數與數據文件的不一樣,且某些字段類型都不一致,那怎麼解決呢?方法以下:

------------------文本----------------------

PS F:\> MORE .\stu.csv

學號,姓名,班級

4010404,祝小賢,"A1012",20,male,信息學院

4010405,肖小杰,"A1013",22,female,外院

4010406,鍾小喜,"A1014",24,male,會計學院

4010407,鍾小惠,"A1015",26,female,商學院

--------------------處理-------------------------

mysql> desc stu;   //表結構

+--------+-------------+------+-----+---------+-------+

| Field  | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| sno    | int(11)     | NO   | PRI | NULL    |       |

| sname  | varchar(30) | YES  |     | NULL    |       |

| class  | varchar(20) | YES  |     | NULL    |       |

| age    | int(11)     | YES  |     | NULL    |       |

| gender | tinyint(4)  | YES  |     | NULL    |       |

+--------+-------------+------+-----+---------+-------+

rows in set (0.01 sec)


mysql> LOAD DATA INFILE 'F:\stu.csv' INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TER

MINATED BY '\r\n' IGNORE 1 LINES (SNO,SNAME,CLASS,AGE,@GENDER,@x) SET GENDER=IF(@GENDER='MALE',1,0);

Query OK, 4 rows affected (0.09 sec)

Records: 4  Deleted: 0  Skipped: 0  Warnings: 0


mysql> SELECT * FROM STU;

+---------+--------+-------+------+--------+

| sno     | sname  | class | age  | gender |

+---------+--------+-------+------+--------+

| 4010404 | 祝小賢 | A1012 |   20 |      1 |

| 4010405 | 肖小杰 | A1013 |   22 |      0 |

| 4010406 | 鍾小喜 | A1014 |   24 |      1 |

| 4010407 | 鍾小惠 | A1015 |   26 |      0 |

+---------+--------+-------+------+--------+

rows in set (0.00 sec)

數據導出

數據導出比較簡單,只要會SELECT ...INTO OUTFILE語句便可,例如

mysql> SELECT * FROM STU INTO OUTFILE "F:\stu_bak.txt"  CHARACTER SET GBK FIELDS TERMINATED BY '##' LINES TERMINATED BY'\r\n';

Query OK, 4 rows affected (0.00 sec)

-------------------------------stu_bak.txt-----------------------

PS F:\> MORE .\stu_bak.txt

4010404##祝小賢##A1012##20##1

4010405##肖小杰##A1013##22##0

4010406##鍾小喜##A1014##24##1

4010407##鍾小惠##A1015##26##0


還有一個SELECT...INTO DUMPFILE,這個語句也是將數據導出到文件,可是不能格式化語句,如FIELDS,LINES這些,它是將數據原汁原味輸出到文件。可是隻能輸出一個記錄,用處不大。

wKioL1Y6nrbRFtzqAADqcjpg4hg407.jpg

相關文章
相關標籤/搜索