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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL导出记录到Excel表格下载打开后乱码问题

發布時間:2023/12/14 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL导出记录到Excel表格下载打开后乱码问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL版本5.7,基于java的服務器
1.獲取導出文件權限
數據庫/表設置權限時經常會

mysql>grant all privileges on databasename.tablename to username@localhost; mysql>flush priviliges;

來獲取所有權限,但是需要注意的是這里面并沒有包括允許導出文件的權限,相關權限需要單獨設置

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/為例

mysql>select * from filename into outfile '/var/lib/mysql-files/filename.xls';

操作后可在對應位置獲取文件。
4.文件轉碼
通常安裝MySQL時我們會將字符集設置為UTF-8來獲得更好的通用性,但是鑒于我們windows上Excle解碼默認為GBK,因此按上述步驟生成的.xls文件直接下載打開會出現亂碼,要解決這一問題,一個有效的方法是在服務器端將文件寫入發送流時進行轉碼。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub/*生成.xls文件的操作;*///獲取文件讀入流與下載輸出流BufferedInputStream ins=new BufferedInputStream(new FileInputStream(xlsPath+fileName);BufferedOutputStream outs=new BufferedOutputStream(response.getOutputStream());//http協議頭response.setHeader("Content-Disposition","attachment;filename="+fileName);byte[] bytes=new byte[ins.available()];//保存原文件的字節編碼byte[] buffer;//保存轉碼后的文件字節編碼String temp=null;//暫存文件字符編碼temp=new String(bytes,"utf-8");buffer=temp.getBytes("gbk");outs.write(buffer);outs.flush();outs.close();}

另外關于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表格下载打开后乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。