将特殊字符 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,那么您还可以保存字符“ů”。
我在将数据从 R 传递到 SQL 然后再读回时遇到问题
原始数据来自一些 excel 文件并具有以下字样:Průmyslový
使用latin1
进行编码会使单词Prumyslový
使用 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,那么您还可以保存字符“ů”。