储存数据至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的主要内容,如果未能解决你的问题,请参考以下文章

创建触发器时出现错误 1064

在 MySQL Workbench 中导入自包含文件时出现 ERROR 1064

mysql建表时出现错误,代码是1064

在 mysql 中创建触发器时出现错误“1064”?

Mysql创建存储过程时出现ERROR 1064错误

更新触发器后创建空字符串时出现无法解释的 MySQL 错误 #1064?