Возникли проблемы при установке charset = utf8 с peewee и pymysql - PullRequest
1 голос
/ 17 октября 2019

У меня возникла проблема с установкой utf8 в моей таблице базы данных.

Я следовал этим документам, но не работал

документы для pymsql: https://pymysql.readthedocs.io/en/latest/modules/connections.html

документы для peewee:http://docs.peewee -orm.com / ru / 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?

Буду очень признателен, если кто-нибудь сможет мне помочь.

Спасибо, что прочитали это.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019
  • Таблица и ее столбцы имеют заданную кодировку для символов. (латиница 1, в вашем случае)
  • клиент имеет кодировку. Это указывает, каким образом буквы с акцентом и т. Д. Кодируются в 1 байт (для латиницы 1) или в 2 байта (для utf8) и т. Д.
  • Вы сообщаете MySQL, что такое кодировка client через 3 настройки -

    character_set_client
    character_set_connection
    character_set_results
    

Они, вероятно, установлены косвенно из одной из вещей, которые вы сказали peewee или pymysql. * Когда происходит INSERT или SELECT, кодировка клиента на лету преобразуется в кодировку столбца.

latin1 подходит для западноевропейских языков, но неадекватнадля остального мира.

0 голосов
/ 17 октября 2019

Это устанавливает кодировку соединения. Чтобы изменить кодировку по умолчанию для таблицы, вы можете изменить 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 / ен / последний / PeeWee / models.html # модель-опции-и-таблицы метаданных

...