首页 > 解决方案 > dbplyr 字符列作为 TEXT 而不是 VARCHAR 到数据库

问题描述

假设我正在使用 starwars 数据集,并尝试在 Mysql 数据库中创建表(使用 copy_to)

    library(tidyverse)
    data <- starwars %>%
      select(name, skin_color)

    data

    # A tibble: 87 x 2
   name               skin_color 
   <chr>              <chr>      
 1 Luke Skywalker     fair       
 2 C-3PO              gold       
 3 R2-D2              white, blue
 4 Darth Vader        white      
 5 Leia Organa        light      
 6 Owen Lars          light      
 7 Beru Whitesun lars light      
 8 R5-D4              white, red 
 9 Biggs Darklighter  light      
10 Obi-Wan Kenobi     fair       
# … with 77 more rows

conn <- DBI::dbConnect(RMariaDB::MariaDB(),
                            host = "myhost",
                            user = "myuser",
                            password = "mypass",
                            db = "mydb")

copy_to(conn, data, temporary = FALSE, overwrite = TRUE)

问题是字符列被创建为 TEXT 列,但正确的定义应该是 VARCHAR。

DESC table data

`data` (
    `name` TEXT NULL,
    `skin_color` TEXT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

如何强制使用 varchar 而不是文本?

标签: mysqlrdplyrdbplyr

解决方案


This may not be your ideal solution, but you could always try first creating the target table in MariaDB before you run the R script. Then, call copy_to with overwrite set to false:

From MariaDB:

CREATE TABLE data (
    name varchar(255),
    skin_color varchar(255)
);

From R:

copy_to(conn, data, temporary=FALSE, overwrite=FALSE)

推荐阅读