Mac High Sierra环境下FreeTDS+ODBC连接IBM Cloud DB2失败求助
解决Mac High Sierra 10.13.4下用FreeTDS连接IBM Cloud DB2的问题
我之前帮朋友处理过类似的场景,Mac上用FreeTDS连IBM Cloud的BLUDB(DashDB)确实需要几步精准配置,咱们一步步来:
1. 先确认FreeTDS安装状态
打开终端跑这个命令,确认FreeTDS已经正确安装,并且能看到版本信息:
tsql -C
如果输出里有Compile-time settings的详细内容,说明安装没问题;如果报错,先重新用Homebrew装一遍:brew install freetds。
2. 配置FreeTDS核心文件
FreeTDS的配置文件一般在/usr/local/etc/freetds.conf(Homebrew安装的路径),用文本编辑器打开它,在文件末尾添加你的BLUDB配置段:
[BLUDB] host = dashdb-entry-yp-lon02-01.services.eu-gb.bluemix.net # 替换成你的实际hostname port = 50000 # 划重点:IBM Cloud DB2的TDS协议端口是50000,别用原生DB2的50001 tds version = 7.0 # 你指定的版本,要是连不上可以试试7.3 database = BLUDB client charset = UTF-8 # 避免中文乱码
保存退出就行。
3. 配置ODBC数据源
Mac上ODBC需要两个配置文件,咱们先搞定用户级的(不用改系统文件):
3.1 编辑用户级ODBC数据源文件
创建或编辑~/.odbc.ini,添加以下内容:
[BLUDB_ODBC] Driver = FreeTDS ServerName = BLUDB # 这个必须和刚才freetds.conf里的配置段名称完全一致 UID = 你的DB2用户名 # 去IBM Cloud控制台找你的数据库凭证 PWD = 你的DB2密码 Database = BLUDB
3.2 确认ODBC驱动配置
检查/Library/ODBC/odbcinst.ini里有没有FreeTDS的条目,如果没有就加上:
[FreeTDS] Driver = /usr/local/lib/libtdsodbc.so # 要是找不到这个文件,用`find /usr/local -name libtdsodbc.so`找实际路径 Setup = /usr/local/lib/libtdsodbc.so UsageCount = 1
可以用odbcinst -j命令查看ODBC配置文件的默认路径,确保没搞错位置。
4. 先在终端测试连接
别着急跑R代码,先在终端用ODBC工具测试连接是否通:
isql BLUDB_ODBC 你的用户名 你的密码
如果出现SQL>提示符,说明连接成功了;要是报错,根据提示排查(比如密码错了、端口不对、TDS版本不兼容)。
5. 调整你的R代码
现在可以回到R里写连接代码了,两种方式选一种就行:
方式一:用配置好的ODBC数据源(更简洁)
library(RODBC) # 连接数据库 conn <- odbcConnect("BLUDB_ODBC") # 测试查询(DB2的测试表是SYSIBM.SYSDUMMY1) sqlQuery(conn, "SELECT 1 FROM SYSIBM.SYSDUMMY1") # 用完记得关闭连接 odbcClose(conn)
方式二:直接指定所有参数(不用依赖配置文件)
library(RODBC) dsn_driver <- "FreeTDS" dsn_tdsVersion <- "7.0" dsn_database <- "BLUDB" dsn_hostname <- "dashdb-entry-yp-lon02-01.services.eu-gb.bluemix.net" username <- "你的DB2用户名" password <- "你的DB2密码" conn <- odbcDriverConnect( paste0( "Driver={", dsn_driver, "};", "Server=", dsn_hostname, ";", "Port=50000;", "Database=", dsn_database, ";", "TDS_Version=", dsn_tdsVersion, ";", "UID=", username, ";", "PWD=", password, ";" ) ) # 测试查询 sqlQuery(conn, "SELECT 1 FROM SYSIBM.SYSDUMMY1") odbcClose(conn)
几个容易踩的坑
- 端口别搞混:TDS协议用50000,DB2原生JDBC用50001,用错了肯定连不上
- TDS版本:如果7.0连不上,试试7.3(对应SQL Server 2012+,DB2对新版本支持更好)
- 路径问题:如果Homebrew装的FreeTDS版本更新过,
libtdsodbc.so的路径可能变,用find命令找最新路径
内容的提问来源于stack exchange,提问作者Partha
相关产品推荐
相关产品推荐

