我在数据库表上设置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这意味着字符集已经设置了'latin1‘,我可以通过在其中插入一些数据来知道这一点。
为什么会这样呢?
我是不是在设置字符集ase uf8时出错了?
如果有人能帮助我,我将不胜感激。
感谢您阅读这篇文章。
发布于 2019-10-17 23:34:07
它设置连接的字符集。要更改表中的缺省字符集,可以修改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
发布于 2019-10-18 06:02:23
character_set_client character_set_connection character_set_results
这些可能是从你告诉peewee或pymysql的事情中间接设置的。*当发生INSERT或SELECT时,客户端编码会动态转换为列的编码。
latin1适用于西欧语言,但不适用于世界其他语言。
https://stackoverflow.com/questions/58424506
复制相似问题