使用mysql+sqlalchemy中文乱码问题(mysql5.7+)

 

当把pd.DataFrame数据存入数据库时报错:

#存入数据库
engine = create_engine('mysql+pymysql://用户名:密码@39.100.49.243:3306/adventure')

gather_customer_order_city_10_11.to_sql('pt_bicy_november_october_top10_city', con = engine, if_exists='replace', index=False)

报错❌:

InternalError: (pymysql.err.InternalError) 
(1366, "Incorrect string value: '\\xE4\\xB8\\x8A\\xE6\\xB5\\xB7...' for column 'chinese_city' at row 1")

 

参考了一些文章:

https://blog.csdn.net/lanyang123456/article/details/63289801

原因是:后台DB表及字段编码问题。

办法1:

如果数据库中没有这个表,会创建新表,但不会存入数据。可以修改字段名:

mysql> alter table pt_bicy_november_october_top10_city  modify create_year_month text charset utf8;
Query OK, 0 rows affected (0.08 sec)

mysql> alter table pt_bicy_november_october_top10_city  modify chinese_city text charset utf8;
Query OK, 0 rows affected (0.08 sec)

alter table 表名 modify 字段名称 字段定义 ⚠️只修改字段定义。

 

办法2:

在存入数据库前,创建这个表并指定字符集为utf8。

  1. 可以先上传,会自动创建表,但报错后,无数据存入
  2. show create table 表名字
  3. 删除刚刚创建的表,drop table xxx;
  4. 复制显示的创建表的代码,然后修改最后一行charset=utf8;
  5. 重新上传。
CREATE TABLE `pt_bicycle_product_sales_month` (
  `product_name` text,
  `cpzl_zw` text,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

 

 

 

办法3(对我的系统来说,不管用)

第一步,配置mysql

vim /etc/mysql/mysql.conf.d/mysqld.cnf

vim /etc/mysql/my.cnf

在my.cnf文件中添加

[client]

default-character-set=utf8

在[mysqld]下添加

character-set-server=utf8

然后保存,重启mysql。

验证,输入命令:show variables like 'character%';结果如下,证明更改成功。

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

 

但之后尝试不管用。

办法3参考了

https://stackoverflow.com/questions/10957238/incorrect-string-value-when-trying-to-insert-utf-8-into-mysql-via-jdbc

https://blog.csdn.net/davy886/article/details/80645782

 

posted @ 2020-04-01 17:12  Mr-chen  阅读(934)  评论(0编辑  收藏  举报