使用MariaDB ODBC 3.1.3 Driver将数据从 MariaDB 导入 R 时会出现奇怪的行为。我要导入的数据库中的表是:
+----------------------------+---------+-----+------+
| analyse | einheit | MIN | max |
+----------------------------+---------+-----+------+
| ALAT/GPT | U/L | \N | 35 |
| ALAT/GPT | U/L | 1 | 5000 |
| Albumin | g/L | 35 | 55 |
| Albumin | g/L | 1 | 200 |
| Albumin im Urin | mg/L | 0 | 20 |
| Albumin im Urin | mg/L | 0 | \N |
| Albumin/Kreatinin-Quotient | mg/g | 0 | 30 |
| Albumin/Kreatinin-Quotient | mg/g | 0 | 7000 |
| Alkalische Phosphatase | U/L | 36 | 92 |
| Alkalische Phosphatase | U/L | 1 | 3000 |
+----------------------------+---------+-----+------+
如果我使用MariaDB ODBC 3.1.3 驱动程序将表导入 R,我会在 R 中得到这个:
+------+------------------------------+----------+------+-------+
| row | analyse | einheit | min | max |
+------+------------------------------+----------+------+-------+
| 1 | ALAT/GPT | U/L | NA | 35 |
| 2 | ALAT/GPT | U/L | 0 | 0 | <-
| 3 | Albumin | g/L | 1 | 5000 |
| 4 | Albumin | g/L | 0 | 0 | <-
| 5 | Albumin im Urin | mg/L | 35 | 55 |
| 6 | Albumin im Urin | mg/L | 0 | NA |
| 7 | Albumin/Kreatinin-Quotient | mg/g | 1 | 200 |
| 8 | Albumin/Kreatinin-Quotient | mg/g | 0 | 0 | <-
| 9 | Alkalische Phosphatase | U/L | 0 | 20 |
| 10 | Alkalische Phosphatase | U/L | 0 | 0 | <-
+------+------------------------------+----------+------+-------+
显然,在第 2,4,8 和 10 行中插入了列min
和一对 (0,0),将这些列的值向下移动。max
这只发生在这个特定的表上。如果我将其他表从 DB 导入到 RI,则得到正确的表。
如果我使用MySQL ODBC 8.0 unicode 驱动程序,它也可以与这个特定的表一起正常工作。这种行为是否有原因,使用此驱动程序时是否可以避免这种行为?
环境:
- 视窗 10
- R 版本 3.6.1 (2019-07-05))
- RODBC 1.3-16
- MariaDB 10.4.8
- MariaDB ODBC 3.1 驱动程序
更新 1: MariaODBC(版本 3.1.6)与 MariaDB 实例的所有数据库连接,而不仅仅是一个。
以下脚本比较 maria-odbc 和 mysql-odbc。
library("RODBC")
odbcDataSources()
## -- Two connections
## ma: maria-odbc
## my: mysql-odbc
conn_ma <- odbcConnect("tabl_curr_add_mdo")
conn_my <- odbcConnect("tabl_curr_add")
odbcGetInfo(conn_ma)
odbcGetInfo(conn_my)
head(sqlTables(conn_ma),2)
## +--------------+---------------------+
## | TABLE_SCHEM | TABLE_NAME |
## +--------------+---------------------+
## | codes | ci5v09_ch3_00 |
## | codes | ci5v09_ch3_01 |
## +--------------+---------------------+
表架构/数据库codes
未连接正确的数据库。
head(sqlTables(conn_my),2)
## +---------------+----------------+
## | TABLE_SCHEM | TABLE_NAME |
## +---------------+----------------+
## | tabl_curr_add | arzt |
## | tabl_curr_add | arzt_ctrl_1 |
## +---------------+----------------+
表架构/数据库tabl
是正确的数据库。
length(unique(sqlTables(conn_ma)$TABLE_CAT))
## 35 databases
length(unique(sqlTables(conn_my)$TABLE_CAT))
## 1 database
结论 1:maria-odbc 确实连接到 MariaDB 实例的所有数据库。
lim_ma <- sqlQuery(conn_ma, "SELECT analyse, min, max FROM tabl_curr_add.labor_limits")
head(lim_ma)
## +--------------------+------+-------+
## | nalyse | min | max |
## +--------------------+------+-------+
## | ALAT/GPT | NA | 35 |
## | ALAT/GPT | 0 | 0 |
## | Albumin | 1 | 5000 |
## | Albumin | 0 | 0 |
## | Albumin im Urin | 35 | 55 |
## | Albumin im Urin | 0 | NA |
## +--------------------+------+-------+
lim_my <- sqlQuery(conn_my, "SELECT analyse, min, max FROM tabl_curr_add.labor_limits")
head(lim_my)
## +--------------------+------+-------+
## | analyse | min | max |
## +--------------------+------+-------+
## | ALAT/GPT | NA | 35 |
## | ALAT/GPT | 1 | 5000 |
## | Albumin | 35 | 55 |
## | Albumin | 1 | 200 |
## | Albumin im Urin | 0 | 20 |
## | Albumin im Urin | 0 | NA |
## +--------------------+------+-------+
结论 2:maria-odbc 在导入 R 时会损坏数据。
更新 2: MariaDB ODBC 不适用于 Excel MSQuery(MySQL ODBC 可以)。
要查看此问题是否仅与 R 或 RODBC 有关,我尝试使用 excel-odbc、mysql-odbc 和 maria-odbc(最后两个使用 MSquery)使用 Excel 导入数据。excel-odbc 和 mysql-odbc 正确提取表,maria-odbc 没有。出现以下消息:string data, right truncated。我使用了最新版本的 MariaDB ODBC (3.1.6)。