V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
godwow
V2EX  ›  Python

cx_oracle.connect UnicodeDecodeError,求大神支招!

  •  
  •   godwow · 2017-09-21 17:11:59 +08:00 · 3994 次点击
    这是一个创建于 2648 天前的主题,其中的信息可能已经有所发展或是发生改变。
    连接 oracle 数据库报错了,网上搜索了半天,都试过了没解决,报错信息如下,求大神帮忙

    Traceback (most recent call last):
    File "d:\我的文档\桌面\PythonApplication1.py", line 3, in <module>
    db = cx_Oracle.connect("test/[email protected]:2521/orcl")
    UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 95-96: invalid continuation byte
    15 条回复    2017-09-22 08:44:24 +08:00
    lolizeppelin
        2
    lolizeppelin  
       2017-09-21 19:05:30 +08:00 via Android   ❤️ 1
    cx Oracle 找大小比较大的版本

    缩水版不支持中文
    godwow
        3
    godwow  
    OP
       2017-09-21 19:33:07 +08:00
    我是用 pip install cx_Oracle 命令直接安装的,这个也会是缩水版,那我应该去哪下载?
    godwow
        4
    godwow  
    OP
       2017-09-21 19:37:44 +08:00
    @lolizeppelin 我是用 pip install cx_Oracle 命令直接安装的,这个也会是缩水版,那我应该去哪下载?
    heqingpan
        5
    heqingpan  
       2017-09-21 19:52:52 +08:00
    以前做的一个项目有用 python 测试 oracle 数据库,找到了这段,你可以试试。
    import os
    os.environ["NLS_LANG"]=db.execute("select userenv('language') from dual").fetchone()[0].encode("utf8")
    heqingpan
        6
    heqingpan  
       2017-09-21 19:54:26 +08:00   ❤️ 1
    主要就是在创建连接之后设置对应的 os.environ["NLS_LANG"],之后再使用就没有乱码的问题了。
    godwow
        7
    godwow  
    OP
       2017-09-21 20:08:31 +08:00
    @heqingpan 谢谢您的回复!

    我在 cx_Oracle.connect 时候就报错了,源码如下:

    import os
    os.environ["NLS_LANG"]="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

    import cx_Oracle
    db = cx_Oracle.connect("test/[email protected]:2521/orcl", encoding="utf-8")

    “ SIMPLIFIED CHINESE_CHINA.ZHS16GBK ”是用您给的查询语句从数据中查询出来的,还是报错。
    heqingpan
        8
    heqingpan  
       2017-09-21 20:14:33 +08:00
    连接格式不对,应该是:db = cx_Oracle.connect("oracle://test:[email protected]:2521/orcl")
    heqingpan
        9
    heqingpan  
       2017-09-21 20:16:39 +08:00
    额,我看错了,忽略上一段,你是直接用 cx_Oracle,我之前是用 sqlalchemy

    import sqlalchemy
    db=sqlalchemy.create_engine("oracle://test:[email protected]:2521/orcl")
    dawncold
        10
    dawncold  
       2017-09-21 20:39:32 +08:00
    我们项目是这样连接的,你试试
    ```python
    def _get_conn(self):
    os.environ['NLS_LANG'] = 'AMERICAN_CHINA.UTF8'
    conn = None
    connection_string = '{}/{}@{}'.format(self.user, self.password, cx_Oracle.makedsn(self.host, self.port, self.database))
    try:
    conn = cx_Oracle.connect(connection_string)
    conn.outputtypehandler = OracleAdapter.output_type_handler
    conn.autocommit = True
    if self.schema:
    conn.current_schema = str(self.schema) # TODO: current_schema requires str, complains against unicode, may be fixed in new release
    except:
    LOGGER.critical('Cannot connect to database: %(parameters)s', {'parameters': self}, exc_info=1)
    try:
    raise
    finally:
    if conn is not None:
    try:
    conn.close()
    except Exception:
    LOGGER.exception('Cannot close database connection')
    else:
    return conn
    ```
    dawncold
        11
    dawncold  
       2017-09-21 20:40:26 +08:00   ❤️ 1
    godwow
        12
    godwow  
    OP
       2017-09-21 21:05:55 +08:00
    @heqingpan @dawncold 我都试过了,还是不行。python 啥都好,就是字符编码好麻烦啊 - -!
    dawncold
        13
    dawncold  
       2017-09-21 23:02:50 +08:00
    @godwow 连接报这个错误没见过,NLS_LANG 和数据库中的配置最好一样再试试
    lolizeppelin
        14
    lolizeppelin  
       2017-09-22 01:06:41 +08:00 via Android
    找 rpm 或者 exe 包

    这是我以前遇到的问题 你先换版本试试

    http://m.blog.chinaunix.net/uid-23504396-id-3025353.html
    lscomeon
        15
    lscomeon  
       2017-09-22 08:44:24 +08:00
    3 喽
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2603 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:20 · PVG 23:20 · LAX 07:20 · JFK 10:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.