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

Mac下用pyodbc连接SQL Server遇std::runtime_error错误求助

解决Mac上pyodbc连接SQL Server时的collate_byname构造失败错误

我之前也碰到过一模一样的问题,这个错误根源出在系统区域配置(locale)和ODBC驱动的字符排序逻辑兼容上。先帮你梳理下排查和解决步骤:

先定位问题根源

你看到的错误:

libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: collate_byname::collate_byname failed to construct for C/en_CA

本质是系统C标准库找不到C/en_CA这个组合的有效排序规则配置,导致ODBC驱动初始化时崩溃。另外看了你提供的odbcinst.ini和odbc.ini配置,格式和路径都是正确的,暂时不需要修改这两个文件。

解决方案步骤

1. 检查当前系统Locale设置

先打开终端,运行以下命令查看当前的区域配置:

locale

重点看输出里的LC_COLLATE、LC_ALL和LANG这几个变量,如果它们的值是C或者C/en_CA这种非UTF-8的组合,就是问题所在。

2. 临时修复:手动设置UTF-8 Locale

在终端里先执行以下命令,临时设置正确的区域变量:

export LC_ALL=en_CA.UTF-8
export LANG=en_CA.UTF-8

然后在同一个终端窗口里运行你的Python连接脚本,看看是否能正常连接。

3. 永久生效:写入Shell配置文件

如果临时设置有效,想让这个配置永久生效,可以把上面两行命令添加到你的Shell配置文件里:

  • 如果你用的是Zsh(Mac默认Shell),编辑~/.zshrc文件
  • 如果你用的是Bash,编辑~/.bash_profile或~/.bashrc文件

添加后,运行source ~/.zshrc(对应Zsh)或source ~/.bash_profile(对应Bash)让配置立即生效。

4. 优化连接字符串(可选)

你也可以在pyodbc的连接字符串里显式指定字符集,帮驱动跳过自动检测的步骤,修改后的代码如下:

import pyodbc
cnxn = pyodbc.connect(
    "Driver={ODBC Driver 17 for SQL Server};"
    "Server=simvo-dbs.database.windows.net,1433;"
    "Database=degree-planner-db;"
    "UID=simvo_admin@simvo-dbs;"
    "PWD=McGill_514;"
    "loginTimeout=30;"
    "CHARSET=UTF-8;"
)

5. 升级ODBC驱动(兜底方案)

如果以上步骤都没解决,试试升级到最新版的ODBC Driver 17,用Homebrew执行:

brew update
brew upgrade msodbcsql17 mssql-tools

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:47:29