储存数据至mysql数据库时出现 (1064, "You have an error in your SQL syntax; check the manual that correspond
Posted 乐之之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了储存数据至mysql数据库时出现 (1064, "You have an error in your SQL syntax; check the manual that correspond相关的知识,希望对你有一定的参考价值。
在msyql数据库中存储数据时,程序出现了如下报错:
打印存储的数据类型发现数据类型有错误,将数据转为str类型就可以了。。。
解决思路:
在初入数据库学习时,出现这个报错还是有些懵的,于是改了捕获异常,发现存储数据函数有问题。从报错中可以看出是有跟\'自营店\'类似的数据有关系的,于是,查看了自己的数据库的插入语句:
sql = "insert into dang_datas7(title_first, title_second, title_third, book_name, book_now_price, book_pre_price, book_author, book_publishing_house, book_business) values (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
params = [[str(title_first), str(title_second), str(title_third),
str(book_name), str(book_now_price), str(book_pre_price),
str(book_author), str(book_publishing_house),
str(book_business)]]
cursor.executemany(sql, params)
db.commit()
发现并没有什么问题,于是又检查了下数据库建表语法:
create table dang_datas7
(
id int auto_increment
primary key,
title_first varchar(3000) null,
title_second varchar(3000) null,
title_third varchar(3000) null,
book_name varchar(3000) null,
book_now_price varchar(3000) null,
book_pre_price text null,
book_author text null,
book_publishing_house text null,
book_business text null
)
charset = utf8mb3;
desc dang_datas7;
同样发现并没有什么大问题,都是支持字符串类型的数据储存的。于是还是先看一下插入语句的具体类型:
# 查看存储数据的类型
print(type(book_name),type(book_now_price),type(book_pre_price),type(book_author),
type(book_publishing_house),type(book_business),)
发现有些端倪,有个不一样的数据类型混了进来,
<class \'lxml.etree._ElementUnicodeResult\'> <class \'lxml.etree._ElementUnicodeResult\'>
<class \'lxml.etree._ElementUnicodeResult\'> <class \'str\'> <class \'list\'> <class \'str\'>
经检查发现,上述错误是存储的数据类型有问题,报错中有以下几种数据类型如:<class \'lxml.etree._ElementUnicodeResult\'>、list、str,但是在我们的sql语法中只有varchar和text两种数据类型才可以储存,所以,我们将list转化为str类型即可。同样的以防出现同样的错误,我们可以将params中所有的类型改为str字符串类型。如下:
params = [[str(title_first), str(title_second), str(title_third),
str(book_name), str(book_now_price), str(book_pre_price),
str(book_author), str(book_publishing_house),
str(book_business)]]
再执行,发现没有此类报错出现了,这样我们就成功的解决了报错中提示的语法错误的问题了。
但为了后面解决数据库报错,还是建议打印出来插入的数据及语法,以方便检查具体报错内容。
print(sql, params)
像我这种出现了空列表([])的数据出现,于是将其转为字符串就不会出现了,但为了数据的精确性,尽量检查自己的抓取逻辑或加入判断替换为其他数据。
若仍然报错,可通过以下几个方面进行检查:
1、SQL语句中的字段名是否和数据库表结构中的字段名一致;
2、数据库表结构中的字段类型是否和传入的参数类型一致;
3、传入的参数是否有空值或非法值,例如长度超过字段定义的最大长度等;
4、数据库连接是否正常,以及是否有权限执行插入操作。
MySQL 7.0.6-IR3 版本尝试连接数据库时出现问题
【中文标题】MySQL 7.0.6-IR3 版本尝试连接数据库时出现问题【英文标题】:MySQL version 7.0.6-IR3 issue when try to connect to db 【发布时间】:2017-05-17 02:07:25 【问题描述】:当我尝试连接 MySQL 数据库时出现以下错误。
类型违反了继承安全规则: 'MySql.Data.MySqlClient.MySqlProviderServices'。派生类型必须 要么匹配基本类型的安全可访问性,要么更少 可访问。
以下是实体框架配置:
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=7.0.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
在此之前我使用的是 MySQL 6.9.9 并且没有发生错误。 请帮忙。
【问题讨论】:
同样的错误发生在我身上 【参考方案1】:这是 MySql 连接器中的一个已知错误,在此处跟踪: https://bugs.mysql.com/bug.php?id=89134
解决方法是降级到较低版本的连接器(就像您使用的那个)
【讨论】:
以上是关于储存数据至mysql数据库时出现 (1064, "You have an error in your SQL syntax; check the manual that correspond的主要内容,如果未能解决你的问题,请参考以下文章