【问题标题】:problems connecting to mysql 5.7.9 database with utf8mb4使用 utf8mb4 连接到 mysql 5.7.9 数据库的问题
【发布时间】:2016-03-10 13:49:28
【问题描述】:

我有一个我在年初编写的 python-flask 播客应用程序。数据库配置为使用 utf8mb4 字符集(完整的 utf-8)(并具有默认排序规则 utf8mb4_bin)

我在 mac Yosemite 上使用 python-mysql-1.2.5 mysql 5.7.9,但我的 python 应用程序在尝试连接到数据库时挂起。通过自制软件安装。安装到 /usr/local/Cellar/mysql/5.7.9/

经过大量调试后,我可以看到挂起发生在 /Users/xxx/repos/mypodweb/env/lib/python2.7/site-packages/MySQLdb/connections.py

在函数中:

import types, _mysql
...
def set_character_set(self, charset):
        """Set the connection character set to charset. The character
        set can only be changed in MySQL-4.1 and newer. If you try
        to change the character set from the current value in an
        older version, NotSupportedError will be raised."""
        if charset == "utf8mb4":
            py_charset = "utf8"
        else:
            py_charset = charset
        if self.character_set_name() != charset:
            try:
                super(Connection, self).set_character_set(charset) #<<<-- here
            except AttributeError:
                if self._server_version < (4, 1):
                    raise NotSupportedError("server is too old to set charset")
                self.query('SET NAMES %s' % charset)
                self.store_result()
        self.string_decoder.charset = py_charset
        self.unicode_literal.charset = py_charset

所以这引用了 _mysql.set_character_set(charset) ,它只是挂起而没有输出......

所以看起来好像 _mysql.so 是本机库绑定?我猜是……

我注意到有一个不同版本的 mysql 库 - mysql 5.7.9 只有 /usr/local/Cellar/mysql/5.7.9/lib/libmysqlclient.20.dylib 但 _mysql.so 引用 libmysqlclient.18.dylib

该库似乎可以正常工作,因为我可以在挂起后在 mysql 中看到一个睡眠连接。因此建立了一个连接,然后库尝试在其上设置字符集。 (第二行)。

mysql> SHOW FULL PROCESSLIST;
+----+------+-----------------+--------------+---------+------+----------+-----------------------+
| Id | User | Host            | db           | Command | Time | State    | Info                  |
+----+------+-----------------+--------------+---------+------+----------+-----------------------+
|  3 | root | localhost       | NULL         | Query   |    0 | starting | SHOW FULL PROCESSLIST |
|  5 | root | localhost:52486 | mypodweb_dev | Sleep   |    4 |          | NULL                  |
+----+------+-----------------+--------------+---------+------+----------+-----------------------+
2 rows in set (0.00 sec)

所以当我最初尝试迁移我的数据库时会发生错误,我正在使用 alembic 来管理迁移。我还尝试将默认的 alembic env.py 文件更改为使用 QueuePool(而不是 NullPool)——唯一的区别是我在 mysql 中获得了 2 个与 mypodweb_dev 的睡眠连接。

mysql> SHOW FULL PROCESSLIST;
+----+------+-----------------+--------------+---------+------+----------+-----------------------+
| Id | User | Host            | db           | Command | Time | State    | Info                  |
+----+------+-----------------+--------------+---------+------+----------+-----------------------+
|  4 | root | localhost:53359 | mypodweb_dev | Sleep   |  961 |          | NULL                  |
|  5 | root | localhost:53856 | mypodweb_dev | Sleep   |   19 |          | NULL                  |
|  6 | root | localhost       | NULL         | Query   |    0 | starting | SHOW FULL PROCESSLIST |
+----+------+-----------------+--------------+---------+------+----------+-----------------------+

当我用谷歌搜索这个问题时,我什么也找不到。寻找可以让我继续前进的修复或解决方法,因为它只是我的本地开发环境,而我被困在 mo 的起点。

【问题讨论】:

    标签: python mysql database character-encoding


    【解决方案1】:

    python-mysql-1.2.5 只支持最高 5.5 的 MySQL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      相关资源
      最近更新 更多