今天从pandas写入数据到mysql,报InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value:……百度了一下原因,整理一下解决方法。
1.首先排除普通字符编码问题
input_engine = create_engine('mysql+pymysql://root:872612@localhost:3306/dysonbuzz_data',encoding='utf8')
将encoding重新设置之后,依旧报错。无效。
2.关于utf8bm4字符集
随着智能手机的普及,我们开始经常使用表情符号☺、��更好的帮助我们进行交流。但是
utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。
查看mysql版本:命令窗口登陆mysql时就可以看到。
3.更改已经建好的数据库和数据表类型
在命令窗口直接输入如下内容
更改数据库编码:
ALTER DATABASE DATABASE_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
更改表编码:
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATEutf8mb4_general_ci;
如有必要,还可以更改列的编码。
这样运行问题就解决了。
4.一劳永逸的办法
上述方法每次重启mysql服务,这些设置就恢复成默认的设置latin1。截图如下:(我的设置已更改,所以这张图是我下载的网图)
直接修改mysql的配置文件,更改默认设置,则一劳永逸。mysql配置文件ios系统的文件名为my.cnf,windows系统为my.ini ,实在找不到就在磁盘里搜索这个文件。但是免安装版的my.ini在哪?免安装mysql的目录下只有一个my-default.ini,这时先把它拷贝一份,并重命名为my.ini,这样该目录下就有了my.ini和my-default.ini两个ini文件,此时打开my.ini开始修改。
将配置文件更改如下:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
更改好了查看一下:
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
collation_connection 、collation_database 、collation_server是什么没关系。但必须保证character_set_client(客户端来源数据使用的字符集)、character_set_connection(连接层字符集)、character_set_database(当前选中数据库的默认字符集)、character_set_results(查询结果字符集)、character_set_server(默认的内部操作字符集)这几个变量必须是utf8mb4。
这样就更改好啦。有些小伙伴直接看了一劳永逸的办法,按照图文配置好,但是发现还是报错!!!不要忘记【3.更改已经建好的数据库和数据表类型】!!!