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

时间:2018-05-12 17:43:08

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

我试图将希伯来语存储在MySQL表中 - 但我最终看到了问号。 我正在使用Python烧瓶服务器。 我相信字符集和整理设置正确(这是运行的输出' show create table':

  

CREATE TABLE some_tablesome_field varchar(128)COLLATE   utf8mb4_unicode_ci DEFAULT NULL)ENGINE = InnoDB AUTO_INCREMENT = 19 DEFAULT   CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci

我的SQLALCHEMY_DATABASE_URI是:

  

' MySQL的://用户名:密码@本地/数据库的charset = utf-8'

我插入表中的数据最初是在Python视图函数中接收的,我按如下方式处理:

data = request.get_json() 
some_field = data['some_field'].encode('utf-8')
然后我插入" some_field"将对象放入some_field列。

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

3 个答案:

答案 0 :(得分:0)

不要使用编码或解码。坚持使用UTF-8,而不是Unicode。我预测从长远来看你会对Unicode不满意。见"问号"在Trouble with UTF-8 characters; what I see is not what I stored中讨论可能的原因。

答案 1 :(得分:0)

我将MySQLdb与Flask(python)结合使用,并且遇到了完全相同的问题(DB的希伯来语显示为问号 ?????

通过以下步骤解决了该问题:

  1. [link]-更改每个级别的字符集:数据库,表和列!
  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)
    

注意字符集 use_unicode ,尽管我输入了默认值,但此更改解决了问题。

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

答案 2 :(得分:0)

尝试将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)