将R的data.frame写入MySQL数据库
这里主要想纠正一个问题,就是关于含中文字符的data frame写入MySQL时,网上给的错误说法:不能用dbWriteTable函数!!
- 基本思路就是判断变量(列名)和数据是否为utf8编码,如果不是则转为utf8
- data.frame则被转为data.table,一则偷懒,二则速度快
- 如果是csv,强烈推荐data.table的fread,快,无编码坑
#library(readxl, quietly=TRUE) #df <- data.frame(read_excel("d:\\data.xlsx",col_names = TRUE),stringsAsFactors=FALSE) #如果是文本文件或者CSV,建议使用data.table,好处是快,以及避免read_csv的各种编码坑 #connect MySQL library(RMySQL) con <- dbConnect(MySQL(),user="user", password="pwd",dbname="db" , host="mysql.yourhost.com" ,port=3306) library(stringi) toutf8<-function(x) { if (is.factor(x)) { x<-as.character(x) } if(is.character(x)){ if(!all( stri_enc_isutf8(x))){ x<-stri_encode(x, "", "UTF-8") } Encoding(x)<-"utf8" } x } #if R in Windows, convert columns and data to UTF-8 names(df)<-toutf8(names(df)) #下面的代码是偷懒,针对data.frame没有写,有兴趣的可以自己动手,使用data.table的好处还是快 library(data.table) df<-as.data.table(df) #if R in Windows, convert columns and data to UTF-8 if(Sys.info()[["sysname"]]=="Windows"){ names(df)<-toutf8(names(df)) df<-df[ , lapply(.SD, toutf8)] dbGetQuery(con, "set NAMES utf8") } dbWriteTable(con, "data",df)