Python 3.x 为什么使用SQLAlchemy,在MariaDB 10.3.17的JSON列中插入没有ASCII的行会引发UnicodeDeer错误?

Python 3.x 为什么使用SQLAlchemy,在MariaDB 10.3.17的JSON列中插入没有ASCII的行会引发UnicodeDeer错误?,python-3.x,sqlalchemy,mariadb,utf8mb4,Python 3.x,Sqlalchemy,Mariadb,Utf8mb4,我必须在MySQL/MariaDB DB上的表中插入一个带有json列的行,json列通常包含utf8字符作为欧元符号(€)。 我正在使用python3.9和SQLAlchemy 当我在MySQL 5.7上执行insert时,一切正常。 当我尝试新的MariaDB 10.3.17时,我得到: UnicodeEncodeError: 'ascii' codec can't encode character '\u20ac' in position 194: ordinal not in range

我必须在MySQL/MariaDB DB上的表中插入一个带有json列的行,json列通常包含utf8字符作为欧元符号()。
我正在使用python3.9和SQLAlchemy

当我在MySQL 5.7上执行insert时,一切正常。
当我尝试新的MariaDB 10.3.17时,我得到:

UnicodeEncodeError: 'ascii' codec can't encode character '\u20ac' in position 194: ordinal not in range(128)
我将DB和表设置为使用utf8mb4字符集,并将conn设置为使用此字符集,因此我不明白为什么在使用MariaDB时出现错误

下面是示例代码

谢谢

导入json
将sqlalchemy作为sqlal导入
#我使用ssh隧道
db_conf={
“用户名”:“abc”,
“userpwd”:“xyz”,
“db_服务器_ip”:“127.0.0.1”,
“db_服务器_端口”:“3306”,
“数据库名”:“我的开发数据库”
}
ldata={
“id”:“283738_1”,
“tipo_evento”:“RES”,
“身份证提供者”:522,
“事件数据”:{“描述”:“焦虑不安,抑郁和自杀风险:达拉特奥里亚所有人的临床医生”,
“提供者”:“DUERRE CONGRESSI SRL”,“ID事件”:“283738”,“Edizione”:“1”,
“Costo”:“0欧元”,“Crediti”:“12”,“Ore”:“12”,“Dal”:“02/11/2020”,“al”:“03/11/2020”,
“Tipologia Evento”:“RES”,“Obiettivo_formativo”:“4-普雷斯塔齐奥尼疗养院,价值体系,有效性和效率验证。Livelli essenziali di assistenza(LEA)”,
“目的专业”:{“医学奇鲁科”:“Psichiatria;神经病学;”,
“Segreteria Organizazitiva”:{“Nome_Referente”:“MANUELA”,“Cognome_Referente”:“CURSALE”,“CF_Referente”:“CRSMNL67A46H501J”,“Telefono”:“0636010376”,“电子邮件”:MANUELACURSALE@DUERRECONGRESSI.COM"},
“Indirizzo”:{“Regione”:“LOMBARDIA”,“Provincia”:“MILANO”,“Comune”:“MILANO”,“Indirizzo”:“VIA GALVANI 12”,“Luogo”:“希尔顿米兰”}
},
“在线”:错误,
“id_regione”:30,
“id_provincia”:17,
“istat_cod”:“015146”}
#打印(json.dumps(a))
sql_address=f'{db_conf[“db_server_ip”]}:{db_conf[“db_server_port”]}'
conn_string=“mysql+mysqldb://{}:{}@{}/{}?charset=utf8mb4”。格式(
db_conf[“用户名”],
db_conf[“userpwd”],
sql_地址,
数据库配置[“数据库名称”])
engine=sqlal.create_engine(连接字符串,隔离级别=“读取已提交”)
conn=引擎连接()
#基本=自动映射基本()
#基础准备(发动机,反射=真实)
meta=sqlal.MetaData()
work\u eventi=sqlal.Table('work\u eventi',meta,autoload=True,autoload\u with=engine)
res=conn.execute(工作事件插入(ldata))
打印(res.rowcount)
这是表结构:

create table work_eventi
    ( _id           INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    , id            VARCHAR(12) NOT NULL
    , tipo_evento   VARCHAR(3)
    , id_provider   MEDIUMINT(9) NULL
    , on_line       BOOLEAN NULL
    , evento_data   JSON NOT NULL
    , id_regione    SMALLINT NULL
    , id_provincia  SMALLINT NULL
    , istat_cod     CHAR(6) NULL
) ENGINE=InnoDB;

使用json.dumps不工作文件
res=conn.execute(work\u eventi.insert(json.dumps(ldata))
Hi@S.Hashiba,SqlAlchemy需要一个对象而不是字符串根据MariaDB文档中的“json是LONGTEXT的别名”,所以看起来您必须使用
json.dumps()
evento\u数据转换为字符串。例如,在我的小测试中,
ldata={“id”:1,“js”:{“foo”:“0€“}
失败了,但是
ldata={“id”:1,“js”:json.dumps({“foo”:“0€“})}
成功了。但是这变成了一个字符串,不再是一个真正的json