0

使用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)。

4

0 回答 0