使用Mysql期间遇到的一些错误

时间:2024-03-14 10:24:54

Err 1114

ERROR: 1114, The table 'XXXXXXX' is full

 

  1. 老版本的innodb_data_file_path = ibdata1:10M:autoextend:max:128M配置,改为innodb_data_file_path = ibdata1:10M:autoextend
  2. 查看数据库所在磁盘,可能是磁盘满了。

 

Err 1041

[Err] 1041 - Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space

 

Err 1146

[Err] 1146 - Table 'h2.cm_customerinfo' doesn't exist

 

表不存在

 

Err 1054

[Err] 1054 - Unknown column 'DescribeInfo' in 'field list'

字段名字有误

注意,添加字段不要有关键字,关键字加上``符号。

 

Err 1063

#1063 - Incorrect column specifier for column 'xxx'错误

比如主键是自增的,字段类型却是char之类,是无法自增,会出现这个提示

 

Err 1064

语法错误

Err 1093

ERROR 1093 (HY000): You can't specify target table 'TEST' for update in FROM clause

Update的时候包含子查询,会出该异常。

 

update TEST_NOIDX  set CREATETIME=now() where ID in ( select a.ID from TEST_NOIDX a where a.VNAME='Aa');

如此,肯定不行,Mysql对子查询处理,很不好。解决办法:1子查询外再嵌套一层,2使用inner join

update TEST_NOIDX set CREATETIME = now() where ID in (select id from ( select id from TEST_NOIDX where VNAME ='Aa') aa);

update TEST_NOIDX b  inner join  ( select a.ID,a.CREATETIME from TEST_NOIDX a where a.VNAME='Aa') c on b.ID=c.ID set b.CREATETIME=now();

 

Err 1136

[SQL] insert into `user` VALUES ('c',''),('d',NULL);

[Err] 1136 - Column count doesn't match value count at row 1

列计数与第1行的值计数不匹配

如果语法表后的(字段1,字段2)默认没有,那么默认为全字段,后面没有赋值的时候,没有对齐;另外前面写了字段,后面缺少字段赋值,或者前面缺少字段,后面多了字段赋值就会出这个问题。

如:`user`表字段有`id`,`name`,`address`

insert into `user`[无字段参数默认为全部] VALUES ('c',''),('d',NULL); 错误

insert into `user`(`name`)  VALUES ('c',''),('d',NULL); 错误

insert into `user`(`name`,`address`)  VALUES ('c'),('d'); 错误

insert into `user`(`name`,`address`)  VALUES ('c',''),('d',NULL); 正确

Err 1175

You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode,

toggle the option in Preferences - SQL Editor and reconnect.

 

解决方案:

这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,

执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式

 

Err 1226

[Err] 1226 - User 'cmh' has exceeded the 'max_questions' resource (current value: 40)

Err 1227

[Err] 1227 - Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation

[错误]1227-访问被拒绝;您需要(至少一个)此操作的超级或系统变量管理权限

Err 1232 - Incorrect argument type to variable 'XXXXXXXX'

set global tmp_table_size=64M;

动态设置变量的时候,不能直接写带单位的,可以改成:

set global tmp_table_size=64*1024*1024;

show global VARIABLES like 'tmp_table_size';

使用Mysql期间遇到的一些错误

 

Err 1238

动态设置静态参数

Set global datadir='/db/mysql';

[Err] 1238 - Variable 'datadir' is a read only variable

 

Err 1264 - Out of range value for column 'c1' at row 1

列超出范围值,如浮点 定点 整型

Err 1292 - Truncated incorrect DOUBLE value: '/Department/Index'

update sys_stationpower Set PageUrl='/Admin'+PageUrl where PageUrl!='-';

在sql语句进行字符串拼接时,不是我们MSSQL习惯的使用“+”,而是使用mysql自带的字符拼接 函数concat(str1,str2,...)

update sys_stationpower Set PageUrl=CONCAT('/Admin',PageUrl) where PageUrl!='-';

 

Err 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled

此函数的声明中没有确定性、没有SQL或读取SQL数据,并且启用了二进制日志记录

 

分析:

因为CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,ALTER FUNCTION,CALL, DROP PROCEDURE, DROP FUNCTION等语句都会被写进二进制日志,然后在从服务器上执行。但是,一个执行更新的不确定子程序(存储过程、函数、触发器)是不可重复的,在从服务器上执行(相对与主服务器是重复执行)可能会造成恢复的数据与原始数据不同,从服务器不同于主服务器的情况。

为了解决这个问题,MySQL强制要求:
在主服务器上,除非子程序被声明为确定性的或者不更改数据,否则创建或者替换子程序将被拒绝。
这意味着当创建一个子程序的时候,必须要么声明它是确定性的,要么它不改变数据。

声明方式有两种,
第一种:声明是否是确定性的
DETERMINISTIC和NOT DETERMINISTIC指出一个子程序是否对给定的输入总是产生同样的结果。
如果没有给定任一特征,默认是NOT DETERMINISTIC,所以必须明确指定DETERMINISTIC来声明一个子程序是确定性的。 
这里要说明的是:使用NOW() 函数(或它的同义)或者RAND() 函数不会使一个子程序变成非确定性的。对NOW()而言,二进制日志包括时间戳并会被正确的执行。RAND()只要在一个子程序内被调用一次也可以被正确的复制。所以,www.linuxidc.com可以认为时间戳和随机数种子是子程序的确定性输入,它们在主服务器和从服务器上是一样的。

第二种:声明是否会改变数据  
CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL用来指出子程序是读还是写数据的。
无论NO SQL还是READS SQL DATA都指出,子程序没有改变数据,但是必须明确地指定其中一个,因为如果任何指定,默认的指定是CONTAINS SQL。

默认情况下,如果允许CREATE PROCEDURE 或CREATE FUNCTION 语句被接受,就必须明确地指定DETERMINISTIC 或 NO SQL与READS SQL DATA 中的一个,否则就会产生1418错误。

使用Mysql期间遇到的一些错误

 

Err 1451 -Cannot delete or update a parent row: a foreign key constraint fails (...)

FOREIGN_KEY_CHECKS启动和关闭外键约束的方法

在MySQL中删除一张表或一条数据的时候,出现

[Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails (...)

这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。

Err 1052 - Column 'UserID' in group statement is ambiguous

多出现在连表查询中,两张表都有相同字段,那么必须加别名/表名 别名[表名].字段

Err 1701 截断表的时候有约束

Cannot truncate a table referenced in a foreign key constraint (`kunming_data`.`en_answer`, CONSTRAINT `en_answer_ibfk_1` FOREIGN KEY (`QuestionsID`) REFERENCES `kunming_data`.`en_questions` (`ID`))

此问题跟Err1451一样处理。

 

Err 单行长度

MYSQL规定一个行的定义长度不能超过65635,根据字符集gbk一字符2字节,utf8一字符3字节。

如表

Id int,

Username varchar(20),

Phone bigint,

Address(n)

 

当采用gbk,id占4字节,username占41字节(gbk下一个字符2字节,20*2=40,小于255长度,存储长度值为1字节),

Phone占8字节,address(gbk下长度让其超过255,存储长度值为2字节)

计算结果(65535-4-41-8-2)/2=32740  n最长只能是32740.

 

同样utf8下,(65535-4-61-8-2)/3=21820 n最长只能是21820.

 

 

Err Unable to convert MySQL date/time value to System.DateTime

读取到到C#出错,DateTime范围为1000-9999,数据库出现0216-12-25,年份错误,典型时间范围错误。改为2016正常了。

 

Err Mysql8.0.11  caching_sha2_password 无法登录

因为mysql8.0.11 默认加密方式【caching_sha2_password】,Navicat for MySQL和Navicat Premium 12和Mysql Workbench客户端不支持。

使用Mysql期间遇到的一些错误

改变下加密方式

alter user 'cmhdl521'@'%' identified with mysql_native_password by 'genie810304~!_+';

常见的客户端软件即可登录,然后WEB,刷新然后依然是这个错误caching_sha2_password

 

Ini中:

# The default authentication plugin to be used when connecting to the server

当连接到服务器时使用的默认身份验证插件

 

[mysqld]

default_authentication_plugin=caching_sha2_password

改成

[mysqld]

default_authentication_plugin=mysql_native_password

然后正常了

 

The user specified as a definer ('sa'@'%') does not exist

一般是迁移数据库之后的问题

The user specified as a definer ('sa'@'%') does not exist

查看mysql的存储过程的定义者,必须改成拥有的角色名字。

使用Mysql期间遇到的一些错误

 

 

The specified value is not an instance of a valid constant type.

The specified value is not an instance of a valid constant type.

An error occurred while updating the entries. See the inner exception for details.

指定的值不是有效常数类型的实例。

更新条目时出错。详情请参阅内部异常。

 

EF和MYSQL 支持还是不完善,EF实体集不支持标记为无符号的字段,会生成错误的映射,当mysql的值设置为无符号,会导致EF添加、修改失败。

 

 

 

 

Err The provider did not return a ProviderManifestToken string.

EF链接Mysql的时候连接字符串错误,无法访问数据库