【问题标题】:mysql storing text as question marks (flask server)mysql将文本存储为问号(烧瓶服务器)
【发布时间】:2018-05-12 17:43:07
【问题描述】:

我正在尝试将希伯来语存储在 MySQL 表中 - 但我最终看到了问号。 我正在使用 Python 烧瓶服务器。 我相信字符集和排序规则设置正确(这是运行“显示创建表”的输出:

创建表 some_table (some_field varchar(128) 整理 utf8mb4_unicode_ci DEFAULT NULL) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

我的 SQLALCHEMY_DATABASE_URI 是:

'mysql://username:password@localhost/database?charset=utf8'

我插入到表中的数据最初是在 Python 视图函数中接收的,我对其进行如下处理:

data = request.get_json() 
some_field = data['some_field'].encode('utf-8')

然后我将“some_field”对象插入到 some_field 列中。

注意:当我尝试将 some_field 变量打印到 Python 控制台时,我还看到了一个乱码字符串,但我认为这是因为控制台本身无法显示希伯来语(不确定这是否会导致问题)...

【问题讨论】:

  • “我认为这是因为控制台本身无法显示希伯来语” - 所以不要打印字符串,打印表示:':'.join(hex(ord(x))[2:] for x in some_field) 并查看变量是否包含您认为应该的内容,并以正确的编码。另外,请用python2python3 标记帖子,因为它在谈论编码时非常相关。另外,请检查您的网页是否编码正确。
  • @Amadan 我打印出来并得到“5e9:5dc:5d5:5dd”,这是正确的。它是 Python2,感谢您指出这一点。传出 Web 请求的编码设置为 utf-8。而且...在连接字符串中使用 utf8mb4 也不起作用,它会导致错误:/
  • 您在插入数据库之前得到了5e9:5dc:5d5:5dd?从数据库中读取后你得到了什么?你怎么插入?以及如何检索?
  • @Amadan 我将传入数据读为“data = request.get_json()”。当我执行“打印数据”时,我看到 {u'some_field': u'\u05e9\u05dc\u05d5\u05dd'}。但是,如果我尝试“打印数据 ['some_field']”,我会看到乱码。我使用 SQLALCHEMY 插入数据,我尝试直接插入 data['some_field'],以及在应用 decode('utf-8) 和/或 encode('utf-8') 后插入它
  • 你不是说,把数据从数据库里取出来,你会得到什么? (十六进制转储,所以我们不会陷入猜测胡言乱语:))

标签: mysql flask utf-8 python-2.x hebrew


【解决方案1】:

当我最终尝试直接渲染数据时(而不是仅仅在我的 mysql 控制台中盯着它看),结果证明它被正确地存储为 unicode。谢谢@Amadan

【讨论】:

    【解决方案2】:

    不要使用编码或解码。坚持使用 UTF-8,而不是 Unicode。从长远来看,我预测您会对 Unicode 感到不满。有关可能原因的讨论,请参阅Trouble with UTF-8 characters; what I see is not what I stored 中的“问号”。

    【讨论】:

      【解决方案3】:

      我正在使用带有 Flask (python) 的 MySQLdb,并且遇到完全相同(来自 DB 的希伯来语显示为问号 ?????

      通过以下步骤解决:

      1. [link] - 更改每个级别的字符集:DB、表和列!
      2. [link] - 设置名称'utf8';
      3. 这就是我认为与众不同的原因: [link] MySQLdB 连接参数(字符集)。 这就是我的 (python) 连接字符串现在的样子:

        db = MySQLdb.connect(host="username.mysql.pythonanywhere-services.com",  # your host
                             user="username",  # username
                             passwd="yourpassword",  # password
                             db="db(schema)name", # name of the database
                             charset="utf8",
                             use_unicode=True)
        

      注意 charsetuse_unicode 虽然我设置了默认值,但这个更改解决了问题。

      我不确定前面的所有步骤和两个参数是否都是必要的。

      【讨论】:

        【解决方案4】:

        尝试将collation='utf8_bin' 添加到列定义中。 例如,在 models.py 中:

        class Users(db.Model):
            __tablename__ = 'Users'
            id = db.Column(db.Integer, primary_key=True)
            full_name = db.Column(db.String(80, collation='utf8_bin'), unique=False, nullable=False)
            email = db.Column(db.String(120), unique=True, nullable=False)
        

        【讨论】:

          猜你喜欢
          • 2018-05-22
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-20
          • 2014-08-06
          • 1970-01-01
          • 2016-11-29
          相关资源
          最近更新 更多