Mac下用pyodbc连接SQL Server遇std::runtime_error错误求助
我之前也碰到过一模一样的问题,这个错误根源出在系统区域配置(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

