本來以為自己已經(jīng)了解了LOAD_FILE這個(gè)函數(shù)的用法:指定一個(gè)本地文件愿卸,取得文件內(nèi)容(二進(jìn)制形式)听诸,以便往blob類型的字段里面設(shè)值。
結(jié)果今天嘗試的時(shí)候潮瓶,死活沒法把數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫陶冷。
后來發(fā)現(xiàn):select LOAD_FILE('abc123.pdf'); 直接返回null,其結(jié)果和指定一個(gè)不存在的文件名的結(jié)果一樣:如果把參數(shù)改成一個(gè)不存在的文件名毯辅,也是返回null埂伦。
第1次查找:到網(wǎng)上一通找,發(fā)現(xiàn)原來還有目錄權(quán)限設(shè)置的問題思恐,可我是在Windows上試驗(yàn)沾谜,沒有目錄權(quán)限之說啊膊毁。
第2次查找:原來MySQL為了安全起見,限定了可以上傳文件的目錄基跑。
用這個(gè)命令(show global variables like '%secure%';)可以查看到:默認(rèn)情況下婚温,只有這個(gè)目錄的文件可以被LOAD_FILE讀取到:
C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\
于是把文件abc123.pdf放到上述目錄,結(jié)果還是讀不到:
注意檢索結(jié)果的路徑用的是這個(gè)符號(hào):\
而設(shè)置的時(shí)候要設(shè)置成這個(gè):/
第3次查找:原來讀文件還有大小限制:
懶得改配置后重新啟動(dòng)MySQL栅螟,試了2個(gè)size小于4MB的文件,結(jié)果都成功了:
2023年9月更新:
max_allowed_packet:這個(gè)值用SET GROBAL max_allowed_packet的方式更新似乎不起作用:show已經(jīng)顯示設(shè)置成功了力图,但是上傳超過4M的文件就是不成功(LOAD_FILE也返回null)。
靠譜的方法室抽,還是在my.ini(Windows版)里面找到max_allowed_packet=4M搪哪,改成max_allowed_packet=128M,然后重新啟動(dòng)MySQL
改完后LOAD_FILE就可以讀入更大的文件:經(jīng)驗(yàn)證41M的文件OK坪圾。
結(jié)論:如果在MySQL里面調(diào)用LOAD_FILE文件返回NULL,排除文件路徑拼寫問題后惑朦,還可以從上面2個(gè)方面確認(rèn)一下兽泄。