将特殊字符 SQL 编码到 R 并返回

Encoding special characters SQL to R and back

我在将数据从 R 传递到 SQL 然后再读回时遇到问题 原始数据来自一些 excel 文件并具有以下字样:Průmyslový

使用latin1进行编码会使单词Prumyslový

中的u贬值

使用 latin2 进行编码会更改 u Prùmyslový

的重音

我可以使用哪种编码? 我正在使用 MS SQL 2016 服务器和包 DBI,通常使用以下代码,其中单词是我写入服务器的数据框的一部分。

我没有使用 UTF-8 因为 öffentlicher 变成了 öffentlicher

DBI::dbConnect(odbc::odbc(),
                      Driver = "SQL Server",
                      Server = "DBABMZ0006", 
                      Database = "EA_DB",
                      encoding = "latin1")

DBI::dbWriteTable(con,
                  Tabelle,
                  df_temp,
                  append=TRUE)

df_test<-DBI::dbReadTable(con,
                          Tabelle)

尝试使用 utf-8 编码,应该可以。

DBI::dbConnect(odbc::odbc(),
                      Driver = "SQL Server",
                      Server = "DBABMZ0006", 
                      Database = "EA_DB",
                      encoding = "UTF-8")

Here 是此编码中的字符列表。

Latin1 编码不支持很多特殊字符,尤其是“€”符号,但是可以使用 Latin1 将“€”符号保存在 VARCHAR 类型的列中数据库排序规则,这里是 öů 和其他编码问题的背景和解决方案:

我们的微软SQL数据库设置为“Latin1_General_CI_AS”排序规则,这里使用“iso_1”字符集。简而言之,“iso_1”表示“ISO-8859-1”,但实际上是“Windows-1252”(CP1252)。被 Microsoft 错误标记 Details here

在我们 R 安装的 Rprofile.site 配置文件中,我们将每个 R 会话的 options(encoding = "UTF-8") 编码设置为默认的“UTF-8”。

要检查您的 R 会话使用的是哪种编码,请执行 getOption("encoding") 命令。如果您使用 Windows 并返回“native.enc”,那么我假设使用了“Windows-1252”编码(操作系统的编码)。

我们在表格的列中使用 VARCHAR 类型(= 8 位代码页),并设置 encoding = "CP1252"(SQL 数据库的编码)我们的问题消失了:

 DBI = {
      dbconnection <- DBI::dbConnect(
        drv = odbc::odbc(),
        Driver = "ODBC Driver 17 for SQL Server",
        Server = instance,
        Database = database,
        # Encoding of SQL-Server, not latin1(!)
        encoding = "CP1252", 
        # Encoding of R sessions, Windows R default is "CP1252" (Windows-1252)
        clientcharset = "UTF-8" 
      )
    }

您也可以尝试将 clientcharset 属性 设置为您的 R 会话的编码。

“ů”在 Windows-1252 编码中不存在。如果您使用 NVARCHAR 列 (=Unicode) 并且将 encoding 设置为 UTF-16,那么您还可以保存字符“ů”。