【问题标题】:Having problem setting 'charset=utf8' with peewee and pymysql使用 peewee 和 pymysql 设置 'charset=utf8' 时出现问题
【发布时间】:2020-02-13 21:29:48
【问题描述】:

我在我的数据库表上设置 utf8 时遇到了一些问题。

我遵循了这些文档但没有工作

pymsql 的文档: https://pymysql.readthedocs.io/en/latest/modules/connections.html

peewee 的文档: http://docs.peewee-orm.com/en/latest/peewee/database.html#using-mysql

这是我的代码

import datetime

from peewee import *
import pymysql
from getDataFromExcel import *

mysql_db = MySQLDatabase(
    databasename,
    user='username',
    password='password',
    host='host',
    charset='utf8', # <-- what I followed from docs

    )

class BaseModel(Model):
    """A base model that will use our MySQL database """
    class Meta:
        database = mysql_db


class Food(BaseModel):
    name = CharField()
    allergy = CharField()
    special = CharField()
    createdAt = DateTimeField(default = datetime.datetime.now)
    updatedAt =DateTimeField(default = datetime.datetime.now)
    class Meta:
        table_name='Food'


def initialize():
    """Create the database and the table if they don't exist."""

    mysql_db.connect()
    print('Initialized')


def insert_food_data(food_rows):
    with mysql_db.atomic():
        Food.insert_many(food_rows,fields=[
            Food.name,
            Food.allergy,
            Food.special
        ]).execute()


if __name__ =='__main__':
    initialize()

我运行这个使用 python3 -i filename.py

之后,我以交互方式添加了一些代码(删除现有表并创建新表以检查 utf8 设置是否完成)

mysql_db.execute_sql("SET FOREIGN_KEY_CHECKS=0")
mysql_db.drop_tables([Food])
mysql_db.create_tables([Food])

但是当我使用 MySQLWorkbench 检查我的数据库时。 我桌子的 DDL 水龙头说


  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `allergy` varchar(255) NOT NULL,
  `special` varchar(255) NOT NULL,
  `createdAt` datetime NOT NULL,
  `updatedAt` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

这意味着 charset 已设置为 'latin1' 我可以通过在其中插入一些数据来知道这一点。

这是为什么呢?

我设置 charset ase uf8 有什么问题吗?

如果有人可以帮助我,将不胜感激。

感谢您阅读本文。

【问题讨论】:

    标签: mysql database utf-8 pymysql peewee


    【解决方案1】:

    设置连接的字符集。要更改表格上的默认字符集,您可以修改my.cnf

    [mysqld]
    character-set-server  = utf8
    collation-server      = utf8_general_ci
    character_set_server   = utf8
    collation_server       = utf8_general_ci
    

    您还可以指定Model.meta.table_settings 来明确指定给定表的字符集。

    class MyModel(Model):
        # ... fields, etc ...
        class Meta:
            database = my_db
            table_settings = ['ENGINE=InnoDB', 'DEFAULT CHARSET=utf8']
    

    http://docs.peewee-orm.com/en/latest/peewee/models.html#model-options-and-table-metadata

    【讨论】:

    • 这些建议都不会更改现有表或列的设置。
    • OP 正在删除并重新创建表。这些建议将解决问题。
    【解决方案2】:
    • 表及其列具有指定的字符编码。 (latin1,在你的情况下)
    • 客户端有一个编码。这表示重音字母等以 1 个字节(对于 latin1)或 2 个字节(对于 utf8)等进行编码的方式。
    • 你通过3个设置告诉MySQLclient编码是什么--

      character_set_client
      character_set_connection
      character_set_results
      

    这些可能是您告诉 peewee 或 pymysql 的一件事间接设置的。 * 当出现INSERTSELECT 时,client 编码会即时转换为列的编码。

    latin1 适用于西欧语言,但不适用于世界其他地区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多