mysql匯入資料一般都是用insert into,那麼mysql有沒有乙個高效匯入方法呢?答案是肯定的,那就是load data infile,下面我們來詳細的講解一下相關的使用方法
基本語法:
根據官方的:
load data
[low_priority | concurrent] [local]
infile 'file_name'
[replace | ignore]
into table tbl_name
[partition (partition_name [, partition_name] ...)]
[character set charset_name]
[[terminated by 'string']
[[optionally] enclosed by 'char']
[escaped by 'char']
][lines
[starting by 'string']
[terminated by 'string']
][ignore number ]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[set col_name=
[, col_name=] ...]
根據官方的資料和網上蒐集的資料,對上面的語法格式一一解釋一下:如
1、low_priority
2、concurrent
concurrent會和其它執行緒同時進行,這個對效能是有一些影響。
3、local
這是個非常重要的關鍵字,指明了檔案的位置,簡單的說,如果指定了local,則表示檔案位於客戶端,如果沒有,則表示檔案在server端。同時,這個關鍵字的使用還會影響到load data命令對於錯誤資料的處理方式
所以,如果我們是在客戶端執行load data命令,一定記得加上local引數。
4、replace | ignore
如果指定了,那麼,當前的資料跟表中的資料有惟一性衝突的時候,採用什麼樣的方式,是替換已有還是忽略當前。特別需要說明的是,當這兩種方式都未指定時,如果資料來自於客戶端,則重複的資料會忽略,如果**於服務端,則命令將終止執行。
5、partition
指定具體的分割槽,由於之前資料庫中沒用到過分區,個人對這塊也不熟悉,所以暫時不解釋,等到了解了再補充
6、character set
指定編碼集,如果檔案的編碼跟資料庫的編碼不一致,可能會出現亂碼的問題。所以要注意的是,這裡指定的是檔案的編碼集,而不是資料庫的編碼集
7、[ [terminated by 『string』][[optionally] enclosed by 『char』][escaped by 『char』]]
[
[terminated by 'string']
[[optionally] enclosed by 'char']
[escaped by 'char']
]
這些指定了對於欄位的處理方式
fields和columns指定其中乙個即可。
terminated表示欄位間的分隔符,
enclosed by
的意思是字段值由什麼符號包圍
escaped
表示指定轉義字元。
在不指定這個引數的情況下,預設的字段分隔符是\t, 預設字段值無任何值包圍,預設轉義字元為\.(反斜)
8、 [lines [starting by 『string』] [terminated by 『string』]]
指定每一行的起始符與終止符,預設情況下,起始符為空,終止符為』\n』,對於windows產生的文字檔案來說,需要指定換行符為』\r\n』.
9、ignore number lines
忽略檔案中的前 number 行,通常情況下,我們生成的檔案可能有列名,那麼要忽略的放在,這兒的值設定為1即可。需要注意的是這裡是行的數量,而不是行號。
10、[(col_name_or_user_var,…)]
有的時候我們不需要給所有的字段都填充值,這個時候就可以指定列名,以()將列名括起來,注意這裡也可以是使用者自定義的使用者表示式。
11、[set col_name = expr,…]
如果在前一步中指定了使用者表示式,那麼相應就可以使用列名等於使用者表示式的方式來指定,這個我沒有用過,給出乙個官方的示例如下:
load data infile 'file.txt' into table t1(column1, @var1) set column2 = @var1/100;
1、建立乙個資料庫:
create database `load_test` character set 'utf8' collate 'utf8_general_ci';
2、建立表
drop
table
ifexists
`tb0`
;create
table tb0(
id bigint(20
)unsigned
notnull
auto_increment
, username varchar(20
)not
null
, age varchar(10
)not
null
, description text
notnull
,primary
key(id)
,unique
key idx_name(username)
)engine
=myisam default
charset
=utf8
2、如果,沒有開啟這個功能時執行load data infile報錯如下:
1148
- the used command is
not allowed with this mysql version
3、我們通過命令檢視一下是否開啟和關閉
show
global variables like
'local_infile'
;
4、如果是關閉狀態的,就把它開啟一下(1為開啟,0為關閉 )
set
global local_infile=
1;
5、新乙個test.txt檔案,通過換行的方式插入資料,內容如下:
"李奎5"
"李奎6"
"李奎7"
上面是換行為乙個字段,一行代表乙個欄位的資料
執行sql的load data infile命令
-- 以換行為一條資料插入到對應的字段
load
data
local
infile
into
table tb0 fields
terminated
by'\n'
(`username`
,`age`
,`description`);
select
*from tb0
6、新乙個test2.txt檔案,通過逗號分隔的方式插入資料,內容如下:
"111111","22222","33333"
-- 以逗號分隔為一條資料插入到對應的字段
load
data
local
infile
into
table tb0
fields
terminated
by','
(`username`
,`age`
,`description`);
select
*from tb0
7、新乙個test3.txt檔案,通過逗號分隔,並且以換行為一條資料,插入批量資料,內容如下:
"王二公尺","20","相貌平常,經常耍流氓!哈哈"
"老三","24","很強"
"老四","34","***xx"
"老五","52","***%*¥*¥*¥*¥"
"小貓","45","中間省略。。。"
"小狗","12","就會叫"
"小妹","21","pp的很"
"小壞蛋","52","表裡不一"
"上帝他爺","96","非常英俊"
"mm來了","10","。。。"
"歌頌黨","20","社會主義好"
"人民好","20","的確是好"
"老高","10","學習很好"
"斜三","60","眼睛斜了"
"中華之子","100","威武的不行了"
"大公尺","63","我愛吃"
"蘋果","15","好吃"
load
data
local
infile
into
table tb0 character
set utf8
fields
terminated
by','
lines
terminated
by'\n'
(`username`
,`age`
,`description`);
select
*from tb0
load data infile使用詳解
基本語法 load data low priority local infile file name txt replace ignore into table tbl name fields terminated by t optionally enclosed by escaped by lin...
load data infile 中文亂碼解決
系統配置linux mysql 預設utf8 首先使用show variables like char variable name value character set client gbk character set connection gbk character set database u...
LOAD DATA INFILE字元編碼的問題
quote load data infile c users denny desktop testpage xx.csv into table taobao shop character set utf8 fields terminated by enclosed by escaped by lin...