日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Linux系统下MySQL的导入数据的命令语句Load Data InFile的用法详解

發(fā)布時(shí)間:2023/12/3 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统下MySQL的导入数据的命令语句Load Data InFile的用法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 語(yǔ)法格式
    • LOW_PRIORITY
    • CONCURRENT
    • LOCAL
    • REPLACE 或 IGNORE
    • PARTITION
    • CHARACTER SET
    • 對(duì)導(dǎo)入文件的字段進(jìn)行格式描述
    • 指定行的起始符號(hào)和終止符號(hào)
    • IGNORE number LINES
    • 指定數(shù)據(jù)表的列名
    • 獲取表達(dá)式的值存儲(chǔ)到指定的列中
  • 開(kāi)啟/關(guān)閉功能
  • 參考示例
    • 示例一
    • 示例二
    • 示例三
    • 示例四
    • 示例五
  • 錯(cuò)誤匯總
    • secure_file_priv 參數(shù)的問(wèn)題
    • 導(dǎo)入的記錄包含的字段值個(gè)數(shù)超過(guò)要導(dǎo)入的列數(shù)
    • 導(dǎo)入文件的字符編碼與數(shù)據(jù)表的字符編碼不一致
    • 導(dǎo)入文件的字段數(shù)量與數(shù)據(jù)表的列數(shù)量不一致
  • 使用 local 與不使用 local 的差異

語(yǔ)法格式

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}] ...]

LOW_PRIORITY

如果你指定關(guān)鍵詞LOW_PRIORITY,這個(gè)只對(duì)那些只采用了表級(jí)別鎖(如MYISAM)的引擎有影響,比如InnoDB使用的是行鎖,不受這個(gè)影響,具體的來(lái)說(shuō),使用了LOW_PRIORITY,則本操作會(huì)在其它線程完成之后再操作。

如果你指定關(guān)鍵詞 low_priority,那么 MySQL 將會(huì)等到?jīng)]有其他人讀這個(gè)表的時(shí)候,才會(huì)插入數(shù)據(jù)。

CONCURRENT

CONCURRENT 會(huì)和其它線程同時(shí)進(jìn)行,這個(gè)對(duì)性能是有一些影響。

LOCAL

這是個(gè)非常重要的關(guān)鍵字,指明了文件的位置,簡(jiǎn)單的說(shuō),如果指定了 local,則表示文件位于客戶端所在主機(jī)的位置,如果沒(méi)有指定,則表示文件在數(shù)據(jù)庫(kù)服務(wù)所在主機(jī)上,即數(shù)據(jù)庫(kù)服務(wù)器上。同時(shí),這個(gè)關(guān)鍵字的使用還會(huì)影響到 load data 命令對(duì)于錯(cuò)誤數(shù)據(jù)的處理方式。

所謂客戶端,就是用來(lái)訪問(wèn)數(shù)據(jù)庫(kù)和管理數(shù)據(jù)庫(kù)的客戶端軟件,例如 Navicat Premium 客戶端。客戶端是安裝在用戶自己的主機(jī)上,通過(guò)客戶端連接上遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器后(即登錄數(shù)據(jù)庫(kù)),可以直接通過(guò)客戶端的圖形化界面對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理,也可以通過(guò)客戶端的命令行界面對(duì)數(shù)據(jù)庫(kù)發(fā)送命令。

例如下面的命令語(yǔ)句來(lái)導(dǎo)入數(shù)據(jù):

mysql> load data low_priority local infile "/Users/liaowenxiong/Desktop/student.txt" into table student columns terminated by ',' lines terminated by '\n' ignore 1 lines (id,age,name); Query OK, 3 rows affected (0.10 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

注:/Users/liaowenxiong/Desktop/student.txt 這個(gè)是文件在客戶端所在主機(jī)的文件路徑。

1.如果是指定了 local,則數(shù)據(jù)從客戶端讀取,文檔中的說(shuō)法是會(huì)在服務(wù)端的臨時(shí)目錄下創(chuàng)建一份文件的副本,但我在測(cè)試的時(shí)候并沒(méi)有發(fā)現(xiàn)。file_name 必須是文件在客戶端所在主機(jī)的絕對(duì)路徑(例如:/Users/liaowenxiong/Desktop/student.txt),由于涉及到數(shù)據(jù)傳輸,所以這種方式會(huì)相對(duì)來(lái)說(shuō)慢一些。

我不使用 Navicat Premium 的命令終端,使用本地主機(jī)的命令終端遠(yuǎn)程登錄數(shù)據(jù)庫(kù)后,執(zhí)行下面的命令:

load data low_priority local infile "student.txt" into table student columns terminated by ',' lines terminated by '\n' ignore 1 lines (id,age,name);

注:這里指定了關(guān)鍵詞 local,直接使用文件名稱(chēng)。此時(shí)使用的是本地主機(jī)命令終端遠(yuǎn)程連接服務(wù)器,所以這種情況下的本地其實(shí)就是服務(wù)器本地,默認(rèn)是在用戶的家目錄下查找文件,當(dāng)前我登錄的是 root 用戶,那么就會(huì)在 /root/ 目錄下查找文件。

2.如果未指定 local,則文件應(yīng)該是直接在服務(wù)端,這種情況下如果文件名使用的是相對(duì)路徑,則又分兩種情況,一種是文件名前沒(méi)有相對(duì)目錄,默認(rèn)是在當(dāng)前數(shù)據(jù)庫(kù)對(duì)應(yīng)的目錄下查找。什么意思呢?假設(shè)你當(dāng)前使用的數(shù)據(jù)庫(kù)名稱(chēng)叫 test,那么在 MySQL 的數(shù)據(jù)根目錄下就會(huì)有一個(gè)目錄名稱(chēng)為 test,那么命令就會(huì)在這個(gè) test 目錄下查找這個(gè)文件;如果你在文件名稱(chēng)前面加上了目錄名稱(chēng),例如,ab/student.txt,那么命令不會(huì)在 test 目錄下查找,但是依舊在 MySQL 的數(shù)據(jù)根目錄下查找,即會(huì)在 MySQL 數(shù)據(jù)根目錄下查找文件路徑 ab/student.txt。

如何查看 MySQL 數(shù)據(jù)庫(kù)的數(shù)據(jù)根目錄,請(qǐng)參見(jiàn)《Linux 下如何查找 MySQL 數(shù)據(jù)庫(kù)的數(shù)據(jù)根目錄呢?》

不指定關(guān)鍵詞 local 直接使用文件名執(zhí)行 load data infile 語(yǔ)句:

mysql> load data low_priority-> infile "student.txt"-> into table student-> columns terminated by ','-> lines terminated by '\n' -> ignore 1 lines -> (id,age,name); ERROR 13 (HY000): Can't get stat of '/var/lib/mysql/test/student.txt' (Errcode: 2 - No such file or directory)

我們看到,提示無(wú)法獲取文件 student.txt 的狀態(tài),默認(rèn)是在 /var/lib/mysql/test/ 目錄查找文件,其中 test 是當(dāng)前數(shù)據(jù)庫(kù)名稱(chēng),/var/lib/mysql 是 MySQL 的數(shù)據(jù)根目錄。

不知道關(guān)鍵詞 local ,在文件名稱(chēng)前面再加上一個(gè)目錄,結(jié)果會(huì)如何:

mysql> load data low_priority-> infile "ab/student.txt"-> into table student-> columns terminated by ','-> lines terminated by '\n' -> ignore 1 lines -> (id,age,name); ERROR 13 (HY000): Can't get stat of '/var/lib/mysql/ab/student.txt' (Errcode: 2 - No such file or directory)

我們看到提示信息,并沒(méi)有在當(dāng)前數(shù)據(jù)庫(kù)下查找文件,而是在數(shù)據(jù)根目錄下根據(jù)你指定的相對(duì)路徑查找文件。

3.如果指定了 local,則當(dāng)某條數(shù)據(jù)處理有誤時(shí),系統(tǒng)把這個(gè)錯(cuò)誤記錄為一個(gè) warning,不會(huì)影響下一條數(shù)據(jù)的處理,因?yàn)樯婕暗綌?shù)據(jù)傳輸。而如果沒(méi)有指定 local,則默認(rèn)情況下,遇到錯(cuò)誤后不會(huì)繼續(xù)執(zhí)行。

REPLACE 或 IGNORE

當(dāng)前的數(shù)據(jù)跟表中的數(shù)據(jù)有惟一性沖突的時(shí)候,采用什么樣的方式,是替換已有還是忽略當(dāng)前。特別需要說(shuō)明的是,當(dāng)這兩種方式都未指定時(shí),如果數(shù)據(jù)來(lái)自于客戶端,則重復(fù)的數(shù)據(jù)會(huì)忽略,如果來(lái)源于服務(wù)端,則命令將終止執(zhí)行。

服務(wù)端執(zhí)行語(yǔ)句,不指定 REPLACE 或 IGNORE:

mysql> load data low_priority-> infile "/root/student.txt"-> into table student-> columns terminated by ','-> lines terminated by '\n' -> ignore 1 lines -> (id,age,name); ERROR 1062 (23000): Duplicate entry '00000000000000000001' for key 'PRIMARY'

服務(wù)端執(zhí)行導(dǎo)入語(yǔ)句,如果導(dǎo)入文檔中存在與數(shù)據(jù)表主鍵重復(fù)的記錄,則直接報(bào)錯(cuò)。

客戶端執(zhí)行語(yǔ)句,不指定 REPLACE 或 IGNORE:

mysql> load data low_priority local infile "/Users/liaowenxiong/Desktop/student.txt" into table student columns terminated by ',' lines terminated by '\n' ignore 1 lines (id,age,name); Query OK, 0 rows affected (0.08 sec) Records: 3 Deleted: 0 Skipped: 3 Warnings: 3

從上面執(zhí)行結(jié)果看,客戶端執(zhí)行導(dǎo)入語(yǔ)句后,會(huì)把導(dǎo)入文檔中與數(shù)據(jù)表主鍵重復(fù)的記錄忽略,即跳過(guò)。

PARTITION

指定具體的分區(qū),由于之前數(shù)據(jù)庫(kù)中沒(méi)用到過(guò)分區(qū),個(gè)人對(duì)這塊也不熟悉,所以暫時(shí)不解釋,等到了解了再補(bǔ)充

CHARACTER SET

指定導(dǎo)入文件的字符編碼,如果文件的字符編碼和數(shù)據(jù)庫(kù)的編碼不一致,可能會(huì)出現(xiàn)亂碼的問(wèn)題。所以要注意的是,這里指定的是文件的字符編碼,而不是數(shù)據(jù)庫(kù)的字符編碼

對(duì)導(dǎo)入文件的字段進(jìn)行格式描述

[{FIELDS | COLUMNS}[TERMINATED BY 'string'][[OPTIONALLY] ENCLOSED BY 'char'][ESCAPED BY 'char']]

1.FIELDS 和 COLUMNS,指定接下來(lái)描述的是導(dǎo)入文件中的字段或者列格式,兩個(gè)任選一個(gè)即可。
2.TERMINATED BY 'string' 指定導(dǎo)入文件中的字段間分隔符是 ‘string’
3.ENCLOSED BY 'char' 指定字段值由什么符號(hào)包圍
4.ESCAPED BY 'char' 指定轉(zhuǎn)義符號(hào)

注意:在不指定這個(gè)參數(shù)的情況下,默認(rèn)的字段分隔符是水平制表符 \t,默認(rèn)字段值無(wú)任何值包圍,默認(rèn)轉(zhuǎn)義字符為 \。

指定行的起始符號(hào)和終止符號(hào)

[LINES [STARTING BY ‘string’] [TERMINATED BY ‘string’]]

1.LINES 指定接下來(lái)描述的是導(dǎo)入文件中的行格式
2.STARTING BY 'string' 指定行開(kāi)始的符號(hào)
3.TERMINATED BY 'string' 指定行結(jié)尾的符號(hào)

如果導(dǎo)入文件的數(shù)據(jù)記錄沒(méi)有起始符號(hào),而每行記錄都是換行產(chǎn)生的,那么這個(gè)選項(xiàng)可以省略。因?yàn)槟J(rèn)情況下,行的起始符為空,終止符為 \n,對(duì)于 Windows 產(chǎn)生的文本文件來(lái)說(shuō),需要指定換行符為 \r\n 。

IGNORE number LINES

忽略文件中的前 number 行,通常情況下,我們生成的文件可能有列名,那么必須忽略列名,即忽略文件的前 1 行。需要注意的是這里是行的數(shù)量,而不是行號(hào)。

指定數(shù)據(jù)表的列名

有的時(shí)候我們不需要給數(shù)據(jù)表中的所有列都填充值,這個(gè)時(shí)候就可以指定數(shù)據(jù)表中的列名,用 () 將列名括起來(lái)。
就是將導(dǎo)入文件的字段依次序?qū)?yīng)數(shù)據(jù)庫(kù)表中列,比方說(shuō)導(dǎo)入文件中的第一個(gè)字段要存儲(chǔ)到數(shù)據(jù)表的哪列中,這個(gè)列名必須明確。

[(col_name_or_user_var,)]

注意:
1.這里也可以是用戶自定義的用戶表達(dá)式
2.這里是指定數(shù)據(jù)庫(kù)中表的列名,不是導(dǎo)入文檔中的列名

獲取表達(dá)式的值存儲(chǔ)到指定的列中

[SET col_name = expr,]

如果在前一步中指定了用戶表達(dá)式,那么相應(yīng)就可以使用列名等于用戶表達(dá)式的方式來(lái)指定,這個(gè)我沒(méi)有用過(guò),給出一個(gè)官方的示例如下:

LOAD DATA INFILE 'file.txt' INTO TABLE t1(column1, @var1) SET column2 = @var1/100;

開(kāi)啟/關(guān)閉功能

LOAD DATA INFILE 這個(gè)導(dǎo)入數(shù)據(jù)命令語(yǔ)句是可以開(kāi)啟和關(guān)閉的,必須開(kāi)啟此功能才能使用,使用如下命令查看功能開(kāi)啟狀態(tài):

mysql> show global variables like 'local_infile'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | local_infile | ON | +---------------+-------+ 1 row in set (0.01 sec)

如果是關(guān)閉的,則輸入以下命令將其開(kāi)啟:

set global local_infile=ON;

參考示例

示例一

student.txt 的內(nèi)容如下:

"id" "name" "00000000000000000001" "liaowenxiong" "00000000000000000002" "liudehua" "00000000000000000003" "zhangxueyou"

student.txt 的內(nèi)容格式分析:
1.第一行記錄是列名稱(chēng),需要忽略掉
2.每列的值使用雙引號(hào)括起來(lái)
3.字段值之間使用制表符分隔(一種空白字符)
4.每行記錄以換行符結(jié)尾,即以換行符分隔

數(shù)據(jù)表結(jié)構(gòu)如下:

mysql> desc student; +-------------+------------------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------------------+------+-----+-------------------+-----------------------------+ | id | bigint(20) unsigned zerofill | NO | PRI | NULL | auto_increment | | name | varchar(30) | YES | | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | | score | double(4,1) | YES | | NULL | | | birthday | date | YES | | NULL | | | insert_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+------------------------------+------+-----+-------------------+-----------------------------+ 6 rows in set (0.00 sec)

登錄數(shù)據(jù)庫(kù)后,執(zhí)行以下命令:

mysql> load data low_priority # 如果你指定關(guān)鍵詞 `low_priority`,那么 MySQL 將會(huì)等到?jīng)]有其他人讀這個(gè)表的時(shí)候,才會(huì)插入數(shù)據(jù) infile "/root/student.txt" # /root/student.txt 這是存放在數(shù)據(jù)庫(kù)服務(wù)器上的導(dǎo)入數(shù)據(jù)的文本文件 into table student # 這是數(shù)據(jù)表 fields terminated by '\t' # 指定字段的分隔符,用單引號(hào)括起來(lái),`\t` 表示tab字符,也是默認(rèn)的字段分隔符 enclosed by '"' # 指定字段值的括起符號(hào),例如,字段值使用雙引號(hào)括起來(lái),那么就指定雙引號(hào)'"',注意單引號(hào)里面的雙引號(hào)才是字段值的括起符號(hào) escaped by '\\' # 指定轉(zhuǎn)義符號(hào),默認(rèn)是反斜杠 lines terminated by '\n' # 指定每行記錄的分隔符,默認(rèn)是換行符,MacOS是`\r`,Linux是`\n`,Windows是`\r\n` ignore 1 lines # 指定忽略前面的多少行記錄,如果導(dǎo)入數(shù)據(jù)的文本文件中含有列名稱(chēng),那么就忽略掉前面的第一行即可 (id,name); # 這里是指定數(shù)據(jù)表的字段名稱(chēng),表示文本文件的第一列對(duì)應(yīng)數(shù)據(jù)表的id字段,第二列對(duì)應(yīng)數(shù)據(jù)表的name字段

無(wú)注釋版本:

load data low_priority infile "/root/student.txt" into table student fields terminated by '\t' enclosed by '"' escaped by '\\' lines terminated by '\n' ignore 1 lines (id,name);

示例二

student.txt 的內(nèi)容如下:

id name 00000000000000000001 liaowenxiong 00000000000000000002 liudehua 00000000000000000003 zhangxueyou

student.txt 的內(nèi)容格式分析:
1.第一行記錄是列名稱(chēng)
2.本示例中,字段值沒(méi)有使用雙引號(hào)括起來(lái),所以不需要通過(guò) enclosed by 來(lái)指定字段閉合符號(hào)。
3.字段值之間使用制表符分隔(一種空白字符)
4.每行記錄以換行符結(jié)尾,即以換行符分隔

執(zhí)行以下命令即可導(dǎo)入數(shù)據(jù):

load data low_priority infile "/root/student.txt" into table student fields terminated by '\t' lines terminated by '\n' ignore 1 lines (id,name);

示例三

student.txt 的內(nèi)容如下:

id,age,name 00000000000000000001,18,liaowenxiong 00000000000000000002,28,liudehua 00000000000000000003,38,zhangxueyou

student.txt 的內(nèi)容格式分析:
1.第一行記錄是列名稱(chēng),需要忽略掉
2.本示例中,字段值沒(méi)有使用雙引號(hào)括起來(lái),所以不需要通過(guò) enclosed by 來(lái)指定字段閉合符號(hào)。
3.字段值之間使用逗號(hào)分隔
4.每行記錄以換行符結(jié)尾,即以換行符分隔
5.文檔中的字段 age 和 name 與數(shù)據(jù)表的順序不同

登錄數(shù)據(jù)庫(kù)后,執(zhí)行命令語(yǔ)句如下:

load data low_priority infile "/root/student.txt" into table student columns terminated by ',' lines terminated by '\n' ignore 1 lines (id,age,name); # 表示文檔的第一列和數(shù)據(jù)表的id字段對(duì)應(yīng),第二列和數(shù)據(jù)表的age字段對(duì)應(yīng),第三列和數(shù)據(jù)表的name字段對(duì)應(yīng)

示例四

student.txt 的內(nèi)容如下:

id,age,name 00000000000000000001,18,liaowenxiong 00000000000000000002,28,liudehua 00000000000000000003,38,zhangxueyou

通過(guò)客戶端 Navicat Premium 的命令行終端執(zhí)行以下的命令:

load data low_priority local infile "/Users/liaowenxiong/Desktop/student.txt" into table student columns terminated by ',' lines terminated by '\n' ignore 1 lines (id,age,name);

通過(guò)客戶端的命令終端執(zhí)行 load data infile 可以使用文件在本地的文件路徑,但是要在前面指定關(guān)鍵詞 local。

示例五

student.txt 的內(nèi)容如下:

id,age,name 00000000000000000001 18 liaowenxiong 00000000000000000002 28 liudehua 00000000000000000003 38 zhangxueyou

執(zhí)行如下命令語(yǔ)句導(dǎo)入數(shù)據(jù):

load data low_priority infile "/root/student.txt" into table student fields terminated by ' ' lines terminated by '\n' ignore 1 lines (id,age,name);

特別注意:字段之間如果使用【空格】分隔,也就是按一下空格鍵,那么這樣的分隔符號(hào)用 ' ' 表示,單引號(hào)內(nèi)輸入一個(gè)空格即可,不是 \t 也不是 \b。

錯(cuò)誤匯總

secure_file_priv 參數(shù)的問(wèn)題

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

在 MySQL 5.7.6 版本引入了參數(shù) secure_file_priv,該參數(shù)用來(lái)指定 LOAD DATA、SELECT … INTO OUTFILE 語(yǔ)句和 LOAD_FILE() 函數(shù)的導(dǎo)入導(dǎo)出目錄。

secure_file_priv 的值如下:

值作用
nullMySQL 服務(wù)禁止導(dǎo)入和導(dǎo)出操作
目錄路徑如果這個(gè)參數(shù)設(shè)為一個(gè)目錄路徑,MySQL 服務(wù)只允許在這個(gè)目錄中執(zhí)行文件的導(dǎo)入和導(dǎo)出操作。這個(gè)目錄必須存在,MySQL 服務(wù)不會(huì)創(chuàng)建它。例如,值為 /tmp/,表示導(dǎo)入/導(dǎo)出只能發(fā)生在 /tmp/ 目錄下
沒(méi)有值表示不對(duì) mysqld 的導(dǎo)入/導(dǎo)出做限制

注:默認(rèn)值是 /var/lib/mysql-files/

查看參數(shù) secure_file_priv 的值,你可以輸入:

mysql> show variables like '%secure%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | require_secure_transport | OFF | | secure_auth | ON | | secure_file_priv | | +--------------------------+-------+ 3 rows in set (0.00 sec)

如何解決:
Windows下,在 MySQL 安裝目錄下找到配置文件 my.ini,打開(kāi)文件后在其中的 [mysqld] 內(nèi)加入 secure_file_priv =''
Centos Linux 下,修改 /etc/my.cnf 文件,在 [mysqld] 內(nèi)加入 secure_file_priv = ''

然后重啟 MySQL 配置才會(huì)生效。

因?yàn)?secure_file_priv 參數(shù)是只讀參數(shù),不能使用 set global 命令修改:

mysql> set global secure_file_priv=''; ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable

導(dǎo)入的記錄包含的字段值個(gè)數(shù)超過(guò)要導(dǎo)入的列數(shù)

ERROR 1262 (01000): Row 1 was truncated; it contained more data than there were input columns

這個(gè)錯(cuò)誤表示第一行被截取了,第一行包含的數(shù)據(jù)超過(guò)了輸入的列數(shù),輸入的列數(shù)由后面的小括號(hào)指定(id,name)。產(chǎn)生這個(gè)問(wèn)題的原因往往是因?yàn)閳?bào)錯(cuò)的行被編輯過(guò),即第一行并沒(méi)有在第二個(gè)字段的位置以換行符結(jié)尾,而是后面還有字符,可能是多余的空白字符等,所以需要手動(dòng)重新整理數(shù)據(jù)。

ERROR 1300 (HY000): Invalid utf8 character string: ''

導(dǎo)入文件的字符編碼與數(shù)據(jù)表的字符編碼不一致

ERROR 1300 (HY000): Invalid utf8 character string: ''

可以將導(dǎo)入文件的字符編碼改成數(shù)據(jù)表的字符編碼保存后再執(zhí)行命令語(yǔ)句。

導(dǎo)入文件的字段數(shù)量與數(shù)據(jù)表的列數(shù)量不一致

ERROR 1261 (01000): Row 228 doesn't contain data for all columns

可能是因?yàn)閿?shù)據(jù)庫(kù)的【嚴(yán)格轉(zhuǎn)換模式】導(dǎo)致,輸入以下的命令查看數(shù)據(jù)庫(kù)的參數(shù) sql_mode 的值:

mysql> show variables like 'sql_mode'; +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

將其中的 STRICT_TRANS_TABLES 就是嚴(yán)格轉(zhuǎn)換模式,可以將其去掉。

set sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

使用 local 與不使用 local 的差異

如果 load data 語(yǔ)句使用了 local 參數(shù),則客戶端使用 TCP 遠(yuǎn)程連接數(shù)據(jù)庫(kù)服務(wù)器時(shí)(例如,你在自己的電腦通過(guò)命令終端使用 SSH 連接遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器),在這種情況下所謂的本地(local)其實(shí)就是服務(wù)端主機(jī)了,那么該命令就會(huì)在服務(wù)端主機(jī)上直接讀取指定的導(dǎo)入文件,沒(méi)有 file 權(quán)限仍然能夠?qū)胛谋疚募?#xff0c;這個(gè)時(shí)候是非常危險(xiǎn)的,因?yàn)?local 參數(shù)的內(nèi)部原理是從客戶端的主機(jī)讀取文本文件并傳送到服務(wù)端的 /tmp 目錄并保存為一個(gè)臨時(shí)文件,再執(zhí)行 load data 語(yǔ)句的。

另外,要使用 local 參數(shù),還需要看服務(wù)端和客戶端是否都開(kāi)啟了 local_infile 功能(默認(rèn)是開(kāi)啟的),任何一端的 local_infile 關(guān)閉了都不能使用 local 參數(shù),會(huì)報(bào)如下的錯(cuò)誤:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

如果 load data 語(yǔ)句不使用 local 參數(shù),則用戶必須要有導(dǎo)入文件的 file 權(quán)限才能夠執(zhí)行 load data 語(yǔ)句導(dǎo)入文本文件的數(shù)據(jù)到數(shù)據(jù)庫(kù)中。如果沒(méi)有file權(quán)限,而執(zhí)行 load data 語(yǔ)句導(dǎo)入文本文件,會(huì)報(bào)沒(méi)有 file 權(quán)限的錯(cuò)誤或者報(bào)如下的錯(cuò)誤:

ERROR 1045 (28000): Access denied for user 'test'@'%' (using password: YES)

為了安全,要限制客戶端使用 local 參數(shù)在沒(méi)有 file 權(quán)限的時(shí)候使用 load data 語(yǔ)句導(dǎo)入文本文件數(shù)據(jù),需要在服務(wù)端將參數(shù) local_infile 的值設(shè)為 OFF。

如果想全面禁止使用 load data 語(yǔ)句,則可以將參數(shù) secure_file_priv 的值設(shè)為 NULL,這樣就無(wú)法使用 load data infile 語(yǔ)句導(dǎo)入數(shù)據(jù)了,也無(wú)法使用 select into outfile 語(yǔ)句導(dǎo)出數(shù)據(jù)。

總結(jié)

以上是生活随笔為你收集整理的Linux系统下MySQL的导入数据的命令语句Load Data InFile的用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。