【问题标题】:utf-8 coding problems using python pyodbc to connect to a Sybase Database in a Docker container使用 python pyodbc 连接到 Docker 容器中的 Sybase 数据库的 utf-8 编码问题
【发布时间】:2020-02-28 10:01:22
【问题描述】:

当我使用pyodbc创建连接时

connectionString = ('DRIVER='+driver+';SERVER='+server+';PORT='+port+';UID='+username+';PWD='+password+';DATABASE='+db_environment)
db_connection_dw = pyodbc.connect(connectionString)
cursor = db_connection_dw.cursor()
cursor.execute(sql_query_string)
print(cursor.fetchone())

对于包含特殊字符的 CharField 类型的字段,我得到了奇怪的结果。 例如,我得到 'M\x8adic' 而不是 'Mèdic'

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONIOENCODING=utf-8

ADD devartodbcase_amd64.deb /tmp/devartodbcase_amd64.deb
RUN apt-get clean && \
    apt-get update && \
    apt-get install -y locales locales-all && \
    locale-gen ca_ES.UTF-8 && \
    apt-get install -y gettext libgettextpo-dev g++ unixodbc unixodbc-dev libaio1 && \
    cd /tmp/ && dpkg -i devartodbcase_amd64.deb

ENV LANG ca_ES.UTF-8
ENV LC_ALL ca_ES.UTF-8

COPY ./requirements.txt /requirements.txt
RUN pip install --upgrade pip==20.0.2 && pip install -r /requirements.txt

RUN mkdir /app
WORKDIR /app
COPY ./app/ /app

requirements.txt

Django==2.2.7
djangorestframework==3.10.3
django-filter==2.2.0
psycopg2==2.8.4
pyodbc==4.0.28

numpy==1.18.1
pandas==1.0.1

python-decouple==3.3
dj-database-url==0.5.0

django-widget-tweaks==1.4.5

SQLAlchemy==1.3.13

是驱动配置,Dockerfile配置引起的问题吗? 提前致谢

【问题讨论】:

  • Python 代码中driver 的值是多少?
  • 如果我打电话给pyodbc.drivers() 我得到['ODBC Drivers', 'Devart ODBC Driver for ASE'] 你指的是那个吗?
  • 我指的是您嵌入到连接字符串中的值:connectionString = ('DRIVER='+driver+...
  • 啊,对不起。我的驱动变量是{Devart ODBC Driver for ASE}
  • 很难说\x8a 可能来自哪里。 “è”是 UTF-8 编码为 C3 A8 所以如果你得到 \xa8 它会更有意义。您可能想看看是否可以从 Devart 那里得到关于他们的驱动程序使用什么编码的明确答案。

标签: python docker utf-8 dockerfile pyodbc


【解决方案1】:

您应该设置连接编码,因为 DB 客户端会导致某些默认的 DB 服务器编码无法在您的脚本中正确解释。您可以在与db_connection_dw.setencoding("utf-8") 建立联系后执行此操作。请参阅以下手册https://github.com/mkleehammer/pyodbc/wiki/Unicode

【讨论】:

  • 你好frost-nzcr4,谢谢。我以前也试过这个,但是没有用
  • 还有这个db_connection_dw.setdecoding(pyodbc.SQL_CHAR, encoding="utf-8")db_connection_dw.setdecoding(pyodbc.SQL_WCHAR, encoding="utf-8")
  • 是的,我尝试了 pyodbc 文档中所有可用的选项,包括这个......
猜你喜欢
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多