使用pyodbc连接SQL Server时遭遇异常错误求助
先聊聊你的问题:你在使用pyodbc连接SQL Server执行查询时,碰到了这个和系统区域配置相关的崩溃异常,先看一下你的代码片段和错误信息:
你的代码片段
connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=xxxxx.xxxx.net;PORT=1443;DATABASE=xxx;UID=xxxx;PWD=xxxx') cursor = connection.cursor() SQLCommand = ("SELECT [Date]...FROM [dbo].[...]") cursor.execute(SQLCommand) results = cursor.fetchone() connection.close # 这里提醒下:你漏了括号,正确写法是connection.close()
错误信息
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: collate_byname::collate_byname failed to construct for C/en_US.UTF-8/C/C/C/C...
这个错误本质是系统Locale配置异常导致的,pyodbc底层依赖系统的字符排序组件,当它无法识别C/en_US.UTF-8这种混合的Locale设置时就会触发崩溃。下面是几个实用的解决方法:
1. 修复系统Locale设置(最常见的解决方式)
这个问题在macOS上比较高发,先打开终端运行locale命令,查看当前的Locale配置。如果输出里有LC_COLLATE=C/en_US.UTF-8或者LC_ALL是类似的混合值,那就是问题根源。
你可以临时设置正确的UTF-8 Locale:
export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8
运行完这两行后,再重新执行你的Python脚本,大概率就能解决问题。如果想让这个设置永久生效,把这两行添加到你的shell配置文件里:
- 用bash的话,编辑
~/.bash_profile - 用zsh的话,编辑
~/.zshrc
保存后重启终端或者执行source ~/.zshrc(对应你的配置文件)即可。
2. 在pyodbc连接字符串里强制指定字符集
在连接字符串中加入CHARSET=UTF-8参数,让pyodbc直接使用UTF-8编码,绕过系统Locale的依赖:
connection = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=xxxxx.xxxx.net;PORT=1443;DATABASE=xxx;UID=xxxx;PWD=xxxx;CHARSET=UTF-8')
3. 升级ODBC驱动版本
你当前使用的是ODBC Driver 17 for SQL Server,旧版本的驱动在macOS的Locale处理上可能存在bug。可以尝试升级到最新的ODBC Driver 18 for SQL Server,重新安装后再测试你的代码。
内容的提问来源于stack exchange,提问作者thomassantosh

