• 华都网—记录中国,传播世界。

使用RMySQL包连接R与MySQL

 时间:2018-09-14 09:31来源:华都网

使用RMySQL包连接R与MySQL

汤汤 2017-01-22 20:54:28 业界

就数据分析工作而言,把数据保存在数据库中有如下的优点:数据集中存放,访问便利;可以保存和处理相对比较大的数据集;多种数据处理软件都能从数据库中直接获取数据,相对

  就数据分析工作而言,把数据保存在数据库中有如下的优点:

数据集中存放,访问便利;

可以保存和处理相对比较大的数据集;

多种数据处理软件都能从数据库中直接获取数据,相对于离线的数据文件,比如Excel文件,数据库更加的高效;

  本文向大家介绍连接R与MySQL的方法,这样就能够直接从数据库中读取数据,并在R中进行分析建模,或者进行数据的可视化分析。

  在Windows上,就我所知,连接R与MySQL有两种方法:

  方法一:通过ODBC驱动程序当做中介进行连接,具体的方法在《MySQL连接到 R Excel 或SPSS》中已详细介绍过,这种方法连接效率相对比较低,今天新闻,但是这种方式可以连接多种支持ODBC驱动程序的数据分析软件,比如SPSS、Excel以及R.

  方法二:通过RMySQL包直接进行连接,这方法的连接效率比方法一更高;使用RMySQL包实现连接的R代码如下:

  

使用RMySQL包连接R与MySQL

  值得注意的是,MySQL与Windows系统默认编码方式不一致会导致中文乱码的情况发生,这是因为R在读取数据时,是以系统的编码方式读取数据的。在连接出现乱码时,需要分别查看一下系统的编码方式与MySQL的编码方式,并确认一下它们是否一致。下面介绍查看Windows系统编码方式与MySQL编码方式的命令。

  Windows下,在命令行下输入 chcp,新闻资讯,查看电脑的字符编码方式,如果返回为936,表明系统是以 GBK 编码的。

  

使用RMySQL包连接R与MySQL

  查看MySQL数据的编码方式,在MySQL命令行中输入 s ,查看MySQL的编码方式,如果不匹配,则需要在连接时修改MySQL的编码方式。使用类似 set names GBK 的语句。(编码方式改变只对这次连接有效,并不会永久改变MySQL数据的编码方式)。

  笔者本人的计算机是以GBK 编码的,而MySQL设置的是 utf8 编码,因此在连接时,改变字符集与不改变字符集,中文会出现乱码与不乱码的对比。下面的内容演示了这两种情况。

  不改变MySQL数据库的编码方式的情况下#载入RMySQL包,如果电脑中没有该包,需要使用 install.packages()函数安装

  library(RMySQL)## Loading required package: DBI #建立与MySQL数据库的连接

  conn<-dbConnect(MySQL(),

  dbname="data",

  username="userID",

  password="password")

  #查询全表

  user_info=dbGetQuery(conn, "select * from user_info")

  #断开连接

  dbDisconnect(conn)## [1] TRUE #查看数据的前6行

  head(user_info)## 骞撮緞 鍑虹敓骞翠唬 鎬у埆## 1 17 90鍚x8e 濂xb3## 2 41 70鍚x8e 鐢xb7## 3 33 80鍚x8e 鐢xb7## 4 84 30鍚x8e 鐢xb7## 5 52 60鍚x8e 鐢xb7## 6 46 70鍚x8e 鐢xb7

  改变MySQL数据库的编码方式与系统一致时library(RMySQL)

  conn<-dbConnect(MySQL(),

  dbname="data",

  username="userID",

  password="password")

  #原来的MySQL是以‘utf8’字符集编码的,而Windows系统是以‘GBK’编码的,需要修改MySQL的字符编码方式,以避免乱码

  dbSendQuery(conn,'SET NAMES GBK')## <MySQLResult:311397264,1,0> user_info=dbGetQuery(conn, "select * from user_info")

  dbDisconnect(conn)## [1] TRUE head(user_info)## 年龄 出生年代 性别## 1 17 90后 女## 2 41 70后 男## 3 33 80后 男## 4 84 30后 男## 5 52 60后 男## 6 46 70后 男