MySQL导出记录到Excel表格下载打开后乱码问题
MySQL版本5.7,基于java的服務器
1.獲取導出文件權限
數據庫/表設置權限時經常會
來獲取所有權限,但是需要注意的是這里面并沒有包括允許導出文件的權限,相關權限需要單獨設置
mysql>grant file on *.* to username@localhost;在數據庫和表的范圍上要設置為全部,即”.“。
2.確定輸出文件位置
MySQL在導出文件位置上也有安全保護限制,限定了用戶只能將文件導出到指定文件夾下,否則操作失敗,而指定的文件夾為secure_file_priv變量的值,可以通過命令行查看,windows下可在my.ini文件中找到,同時也可在my.ini文件中進行修改來適應開發的需要,修改后重新啟動即生效。
在這里有筆者一點經驗在于文件路徑的寫法,windows中使用反斜杠’\’而Linux使用斜杠’/’,在windows上my.ini中仍使用’/’,而windows上命令行查詢結果使用’\’顯示,在筆者個人在windows和centos上操作的情況來看,在導出文件路徑書寫上都使用’/’即可,具體實例可參考下文。
3.導出文件
以Linux下默認文件路徑/var/lib/mysql-files/為例
操作后可在對應位置獲取文件。
4.文件轉碼
通常安裝MySQL時我們會將字符集設置為UTF-8來獲得更好的通用性,但是鑒于我們windows上Excle解碼默認為GBK,因此按上述步驟生成的.xls文件直接下載打開會出現亂碼,要解決這一問題,一個有效的方法是在服務器端將文件寫入發送流時進行轉碼。
另外關于bytes數組的長度設置上,筆者最初看到許多人分享的方法是設置為定長,多次讀取文件的字節轉碼發送,大致如下
byte[] bytes=new byte[2048];byte buffer;String temp=null;int read=0;while((read=ins.read(bytes))!=-1){temp=new String(bytes,"utf-8");buffer=temp.getBytes("gbk",0,read);outs.write(buffer);}outs.flush();outs.close();而在實際應用中筆者發現這樣下載的文件,在個別部分仍然存在少量亂碼,個人猜測是兩次讀取字節轉碼銜接的部分導致了亂碼,具體原因還有待對jdk源碼的考量。
總結
以上是生活随笔為你收集整理的MySQL导出记录到Excel表格下载打开后乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux vim字符串替换
- 下一篇: 数据预处理:中英文印刷字体图片分类数据集