mysql将文本存储为问号(flask服务器)

mysql将文本存储为问号(flask服务器),mysql,flask,utf-8,python-2.x,hebrew,Mysql,Flask,Utf 8,Python 2.x,Hebrew,我试图将希伯来语存储在MySQL表中,但最终我看到了问号。 我正在使用Python flask服务器。 我相信字符集和排序规则设置正确(以下是运行“show create table”的输出: 创建表格some_表格(some_字段varchar(128)整理 utf8mb4_unicode_ci默认值NULL)引擎=InnoDB自动_增量=19默认值 字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci 我的SQLALCHEMY_数据库_URI是: "mysql

我试图将希伯来语存储在MySQL表中,但最终我看到了问号。 我正在使用Python flask服务器。 我相信字符集和排序规则设置正确(以下是运行“show create table”的输出:

创建表格
some_表格
some_字段
varchar(128)整理 utf8mb4_unicode_ci默认值NULL)引擎=InnoDB自动_增量=19默认值 字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci

我的SQLALCHEMY_数据库_URI是:

"mysql://username:password@本地主机/数据库?字符集=utf8'

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

data = request.get_json() 
some_field = data['some_field'].encode('utf-8')
然后将“some_field”对象插入some_field列


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

当我最终尝试直接呈现数据时(而不是在我的mysql控制台中启动它),结果是它被正确地存储为unicode。谢谢@Amadan

不要使用编码或解码。坚持使用UTF-8,而不是unicode。我预测从长远来看,你会对unicode不满意。有关可能的原因的讨论,请参阅中的“问号”。

我正在使用MySQLdb和Flask(python),遇到了完全相同的问题(DB中的希伯来语显示为问号????)

通过以下步骤解决此问题:

  • -更改每个级别的字符集:DB、Table和Column
  • -设置名称“utf8”
  • 我认为这就是造成差异的原因: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)
    
  • 注意字符集并使用unicode尽管我设置了默认值,但这一更改解决了问题


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

    尝试向列定义中添加
    collation='utf8\u 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)
    

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