【MySQL】数据库常见错误及解决

【MySQL】数据库常见错误及解决

码农世界 2024-06-20 后端 92 次浏览 0个评论

目录

  • 2003错误:连接错误
    • 1251错误:身份验证错误
    • 1045错误:拒绝访问错误
    • 服务没有报告任何错误
    • net start mysql 发生系统错误 5。
    • 1064错误:语法错误
    • 1054错误:列名不存在
    • 1442错误:触发器中不能对本表增删改
    • 1303错误:使用工具创建存储过程/触发器时无需写创建这一行
    • 1292错误:类型错误
    • 1265错误:插入的数据不符合数据库设置
    • 1415错误:触发器不能出现 SELECT * FROM
    • 1130错误
    • 1366错误:不能识别中文字段
    • 3780错误:外键添加不上
    • 1075错误:一个数据表中只能有一个自动递增字段
    • 1833错误:外键级联删除问题
    • 1826错误:重复外键名
    • 1055错误:select表达式没有依赖group by 子句中的列
    • 1055错误:select表达式没有依赖group by 子句中的列
    • 1093错误:不能在同一表中查询的数据作为同一表的更新数据
    • 1052错误:列名歧义
    • 1222错误:查询字段数量不一致

      2003错误:连接错误

      错误:2003 -Can’t connect to MySQL server on ‘localhost’(10038)

      解决:Navicat远程连接MySQL时,提示2003错误,可能的原因有

      ①MySQL服务没有启动;②用户没有权限使用远程连接。③防火墙中没有配置MySQL端口(3306)。

      对于第①种情况,Win+R,输入services.msc命令,打开服务,找到MySQL81(其中数字表示MySQL版本),右键启动即可。

      对于第②种情况,在命令行中输入mysql -u root -p登录数据库,按照以下命令修改:

      show databases; 
      use mysql;
      select user,host,password from user;
      update user set host = '%' where user = 'root' and host = 'localhost';
      FLUSH PRIVILEGES;
      

      接着退出MySQL,在命令行中输入net start mysql81(81为8.1版本)。

      对于第③种情况,需要进入控制面板,找到Windows Defender防火墙,点击高级设置,点击入站规则,点击右边的新建规则,点击端口,点击下一步,选择协议类型和端口号(3306)点击下一步即可。

      1251错误:身份验证错误

      错误:1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client

      原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。

      解决:①升级navicat驱动;②把mysql用户登录密码加密规则还原成mysql_native_password。

      方式②需要Win+R,输入cmd打开命令行,进入MySQL的bin目录,然后输入mysql -u root -p,输入密码登录。按照以下命令修改即可。

      ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则
       
      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新一下用户的密码 
       
      FLUSH PRIVILEGES; #刷新权限
      

      1045错误:拒绝访问错误

      错误:在上述进入命令行后输入mysql -u root -p后,出现ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)报错。

      原因:①MySQL的服务器停止:若MySQL服务没有启动,Win+R输入services.msc打开服务后,重启MySQL服务器。

      ②用户的端口号或者IP导致:若用户的端口号与IP(3306/3307)不一致,打开my.ini文件进行编辑。全部编辑替换为: port=X。

      ③MySQL的配置文件错误----my.ini等文件:my.ini文件误输入无效内容。

      ④root用户的密码错误。

      服务没有报告任何错误

      错误:MySQL81 服务正在启动 …

      MySQL81 服务无法启动。

      服务没有报告任何错误。

      解决:由于之前按照其他教程在本地安装了MySQL服务,导致本机上有两个MySQL服务的冲突:

      【MySQL】数据库常见错误及解决

      这种情况下,使用管理员权限运行cmd,输入mysqld --initialize,等待该指令执行完成后,重新使用管理员权限开启一个cmd,输入net stop mysql关闭mysql服务,再输入net start mysql81启动mysql81版本的服务,问题得到解决。

      关闭mysql后,可打开服务管理器,将Mysql的启动类型改为禁用。

      net start mysql 发生系统错误 5。

      默认情况下cmd是以用户身份运行的,出现此类问题是由于没有权限。运行cmd时需要以管理员身份运行。

      以管理员身份运行后再输入命令net start mysql即可。

      1064错误:语法错误

      错误:1064-You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

      解决:SQL语句语法错误,常见的是表名或字段名添加了双引号或单引号,在MySQL中需要添加反引号,这是为了区分MySQL的保留字与普通字符而引入的符号。在Navicat中添加触发器的代码,需要为字段名和表名添加反引号``(在键盘上的左上角数字1旁边)。

      1054错误:列名不存在

      错误:1054-Unknown column ‘XXX’ in ‘field list’

      解决:该列名在数据表中不存在,可能的原因有①SQL语句中的列名写错了,②表名在数据库中不存在,③该列属于后面加上去的,选择全部列可以,单独获取报错,解决办法就是将数据表中的该列重新命名,然后保存,④数据表中的列名多了一个空格,删掉即可。

      1442错误:触发器中不能对本表增删改

      错误:1442-Can’t update table ‘XXX’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

      解决:MySQL中触发器中不能对本表进行 insert ,update ,delete操作,以免递归循环触发。 对于update 只能用set进行操作,insert与delete只能借助第二张表才能实现需求。

      1303错误:使用工具创建存储过程/触发器时无需写创建这一行

      错误:1303-Can’t create a TRIGGER from within another stored routine.

      解决:通过Navicat创建存储过程(或触发器)的时候,不需要写创建的这一行:CREATE PROCEDURE(或TRIGGER) XXX() ,直接在Navicat中选择即可。

      【MySQL】数据库常见错误及解决

      1292错误:类型错误

      错误:1292-Truncated incorrect DOUBLE value: ‘_’

      解决:使用CONCAT()函数连接字段时,将’_‘这个字符串用+号与数值进行了连接,解决方案是使用CONCAT_WS()函数,其中第一个参数为’_‘,这表示将其后的字段使用’_'这个字符串隔开。

      1265错误:插入的数据不符合数据库设置

      错误:1265 - Data truncated for column ‘XXX’ at row 1

      原因:①写入该字段的数据长度大于该字段定义的最大长度,比如定义了字段user_name VARCHAR(10),这个字段定义了最长写入10位字符,但是,如果你写入的数据超过了10位字符,那么就会出现该警告信息。

      ②传入的数据类型有误。比如定义了字段cost DECIMAL(10,2),这个字段小数点后有两位,但是,如果你写入的数据为超过了两位小数,比如10.1122,则会出现该警告信息。

      ③插入了非法字符。

      解决:对库表的字段类型做调整,或者检查插入的数据是否不符合预期。

      1415错误:触发器不能出现 SELECT * FROM

      错误:1415 - Not allowed to return a result set from a trigger

      解决:触发器不能出现 SELECT * FROM TABLE 形式的查询 ,因为其会返回一个结果集 ,但可以用SELECT INTO 来设置变量(虽然MySQL不太支持SELECT INTO语法,但是仅仅只是赋个值还是可以的)。

      1130错误

      错误:1130 - Host ‘XXXX’ is not allowed to connect to this MySQL server.

      1366错误:不能识别中文字段

      错误:1366 - Incorrect string value: ‘\xE4\xBA\xA4\xE6\xB5\x81…’ for column ‘XXX’ at row 1.

      原因:数据库编码和排序类型不是utf-8的,导致数据表也不是utf-8,不能识别中文字段。

      解决:重建数据库,将数据库的字符集设置为utf-8,并把排序规则设置为utf8_general_ci。

      【MySQL】数据库常见错误及解决

      3780错误:外键添加不上

      错误:3780 - Referencing column ‘XXX’ and referenced column ‘XXX’ in foreign key constraint ‘XXX’ are incompatible.

      原因:①主键与外键字段数据类型不一致,例如主键A 表 ID数据类型varchar,外键B 表a_id 为int或别的类型。

      ②主键与外键字段数据类型一致,可能是项目迁移引发的Mysql Charset/Collation 字符编码不一样会报错。

      解决:仔细检查A表主键与B表外键的数据类型是否一致,包括勾选的选项:

      【MySQL】数据库常见错误及解决

      1075错误:一个数据表中只能有一个自动递增字段

      错误:1075- Incorrect table definition; there can be only one auto column and it must be defined as a key.

      原因:一个数据表中只能有一个自动递增字段。

      解决:将除主键外的其他自增字段取消自增。

      1833错误:外键级联删除问题

      错误:1833 - Cannot change column ‘XXX’: used in a foreign key constraint ‘XXX’ of table ‘XXX.XXX’

      原因:由于外键关联问题,修改表结构时出现问题。

      解决:①把表中的外键全部去除。②删除该表,重新建表。

      1826错误:重复外键名

      错误:1826 - Duplicate foreign key constraint name ‘XXX’

      原因:外键名称重复

      解决:修改成不一样的即可

      1055错误:select表达式没有依赖group by 子句中的列

      错误:1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘XXX’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

      原因:select表达式#2-XXX不是聚合函数列,没有依赖group by 子句中的列

      解决:group by 子句后增加select中用到的所有的列,用,隔开

      1055错误:select表达式没有依赖group by 子句中的列

      错误:1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

      原因:MySQL8.0版本普遍问题

      解决:找到本地MySQL的配置文件my.ini,修改[mysqld]下的配置语句如下:

      sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
      

      【MySQL】数据库常见错误及解决

      保存后,在“服务”中重启MySQL即可。

      【MySQL】数据库常见错误及解决

      1093错误:不能在同一表中查询的数据作为同一表的更新数据

      错误:1093 - You can’t specify target table ‘my_depart_manager’ for update in FROM clause

      原因:不能先select出同一表中的某些值,再update这个表(在同一语句中)

      解决:将select出的结果再通过中间表select一遍

      1052错误:列名歧义

      错误:1052 - Column ‘xxx‘ in field list is ambiguous

      原因:在SQL查询中指定的列名在多个表中存在,造成歧义

      解决:在列名前面加上表的别名或表名以指明是哪个表的字段

      1222错误:查询字段数量不一致

      错误:1222 - The used SELECT statements have a different number of columns

      原因:在 SQL 语句中使用了 UNION 连接两张表时,查询字段数量不一致导致

      解决:修改UNION前后两张表的字段数量一致

转载请注明来自码农世界,本文标题:《【MySQL】数据库常见错误及解决》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,92人围观)参与讨论

还没有评论,来说两句吧...

Top