You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DBI和ODBC从FileMaker数据库取数据时的变音符号问题

从RODBC迁移至DBI/odbc后FileMaker数据库UTF-8字符显示异常

问题背景

我正尝试从已弃用的RODBC切换至DBI和odbc包,以从配置为UTF-8编码的FileMaker数据库中获取数据。已配置unixodbc,使用isql可成功检索包含变音符号的数据:
执行isql -v mydb myuid mypwd后,运行select Contexte from Mobilier where ID_Objet = 1会返回正确的Dépôt(终端同样配置为UTF-8)。

DBI/odbc代码及异常结果

切换到R语言后出现编码问题,示例代码如下:

library(DBI)
library(odbc)

con <- dbConnect(odbc::odbc(),
                   driver = "/Library/ODBC/FileMaker ODBC.bundle/Contents/MacOS/fmodbc.so",
                   database = "mydb", 
                   uid = "myuid", 
                   pwd = "mypwd",
                   host = "localhost")

val <- dbGetQuery(con, "select Contexte from Mobilier where ID_Objet = 1")

print(val)
# 输出:
#   Contexte
# 1 D\u008ep\u0099t

RODBC正常代码及结果

使用RODBC则一切正常:

library(RODBC)

con <- odbcConnect("mydb", uid = "myuid", pwd = "mypwd")

val <- sqlQuery(con, "select Contexte from Mobilier where ID_Objet = 1")

print(val)
# 输出:
#   Contexte
# 1    Dépôt

系统及R环境信息

sessionInfo()返回信息如下:

R version 4.3.3 (2024-02-29)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.6.3

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Brussels
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RODBC_1.3-23

loaded via a namespace (and not attached):
[1] compiler_4.3.3    tools_4.3.3       rstudioapi_0.15.0

补充测试

根据建议,尝试用RODBC向数据库插入文本,再用DBI检索:

library(RODBC)
library(DBI)
library(odbc)

con1 <- RODBC::odbcConnect("mydb", uid = "myuid", pwd = "mypwd")
con2 <- DBI::dbConnect(odbc::odbc(),
                  driver = "/Library/ODBC/FileMaker ODBC.bundle/Contents/MacOS/fmodbc.so",
                  database = "mydb",
                  uid = "myuid",
                  pwd = "mypwd",
                  host = "localhost")

# 要通过RODBC插入的带变音符号的数据
insert <- data.frame("ID_Objet" = 5000,
                     "Contexte" = "Dépôt")

# 编码正确
Encoding(insert$Contexte)
# > [1] "UTF-8"

# 使用RODBC插入数据...
RODBC::sqlSave(con1, insert)

# ...并检索
x <- RODBC::sqlQuery(con1, "select * from insert")

# 变音符号正常但编码显示未知...
x$Contexte
# > [1] "Dépôt"
Encoding(x$Contexte)
# > [1] "unknown"

# 现在用DBI和odbc读取同一数据
y <- DBI::dbReadTable(con2, "insert")

# 变音符号丢失但检测到原编码
y$Contexte
# > [1] "D\u008ep\u0099t"
Encoding(y$Contexte)
# >[1] "UTF-8"

内容的提问来源于stack exchange,提问作者lodumont

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:10:37