出现这个报错的原因一般有两个,第一个原因是向数据库存入中文字符时,编码方式出错导致的。第二个是在建表的时候设置的变量类型长度过小或者是存入字符过长,类型不适用
一、下面这段代码是建立数据库和表的正确方法,可以避免第一种原因。
def __init__(self):
#建立连接
self.conn=pymysql.connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD,charset='utf8',port=3306)
#建立游标
self.cursor=self.conn.cursor()
#创建一个名为xina的数据库
#使用execute()方法执行SQL,如果数据库存在则删除
self.cursor.execute("DROP DATABASE IF EXISTS xina;")
self.cursor.execute('create database if not exists xina character set utf8mb4;')
self.cursor.execute('use xina;')
# 创建表并定义变量类型
sql1 = 'create table if not exists news(NEWS_TITLE TEXT,NEWS_TIME date,NEWS_ARTICLE
TEXT) character set utf8mb4'
self.cursor.execute(sql1)
(1)在建立连接的时候,要设置charset=‘utf8’
(2)在创建数据库的时候,sql语句最后要加 set utf8mb4
(3)在建表的时候,sql语句最后要加 set utf8mb4
二、如果第一种已经设置了,但是还是会有报错,可以先看下数据库中是否存入部分数据,或者可以使用sql语句试着存入一条数据,看能否成功。也可以先去看下自己要存的数据的长度和设置的变量的长度是否匹配。因为我是爬取新闻数据之后要存入mysql,数据长度过长,导致报错。之前的建表代码是这样的。
sql1 = 'create table if not exists news(NEWS_TITLE varchar(255),NEWS_TIME date,NEWS_ARTICLE VARCHAR(255)) character set utf8mb4'
self.cursor.execute(sql1)
之后看了下自己要存的数据,差不多有两千多个中文,就将变量的类型改了一下。将VARCHAR(255)改成了TEXT,在pycharm中输入sql语句的时候变量类型会自动变黄,但是我刚开始输入TEXT的时候没有变黄,也没有默认的类型,还以为没有这个数据类型,但其实是有的。将代码改成如下就可以存入了。
sql1 = 'create table if not exists news(NEWS_TITLE TEXT,NEWS_TIME date,NEWS_ARTICLE TEXT) character set utf8mb4'
self.cursor.execute(sql1)