优秀的编程知识分享平台

网站首页 > 技术文章 正文

mysql使用过程的错误记录(四)(mysql失效情况)

nanyue 2024-08-16 00:34:42 技术文章 133 ℃

mysql使用过程的错误记录(四)

一:mysql中sql_safe_updates问题

mysql中update和delete时sql_safe_updates问题

MySQL删除更新数据时报1175错误的问题

今天删除mysql数据库中的一条记录的时候,一直不能删除,提示错误信息如下:

Error Code: 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 -> Query Editor and reconnect.

后来通过搜索资料,发现mysql有个叫SQL_SAFE_UPDATES的变量,为了数据库更新操作的安全性,此值默认为1,所以才会出现更新失败的情况。

下面是SQL_SAFE_UPDATES变量为0和1时的取值说明:

SQL_SAFE_UPDATES有两个取值0和1,

SQL_SAFE_UPDATES = 1时,不带where和limit条件的update和delete操作语句是无法执行的,即使是有where和limit条件但不带key column的update和delete也不能执行。

SQL_SAFE_UPDATES =0时,update和delete操作将会顺利执行。那么很显然,此变量的默认值是1。

所以,出现1175错误的时候,可以先设置SQL_SAFE_UPDATES的值为0,然后再执行更新,例如:

[sql]

SQL_SAFE_UPDATES = 0;

delete from testTable where name='张三';


二:mysql字符集 utf8 utf8mb4

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

mysql和字符集有关的变量

character_set_client:客户端请求数据的字符集

character_set_connection:从客户端接收到数据,然后传输的字符集

character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。

character_set_filesystem:把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的

character_set_results:结果集的字符集

character_set_server:数据库服务器的默认字符集

character_set_system:这个值总是utf8,不需要设置,是为存储系统元数据的字符集

如何让MySQL支持utf8mb4

编译的时候加上:

-DDEFAULT_CHARSET=utf8mb4 \

-DDEFAULT_COLLATION=utf8mb4_unicode_ci

在my.cnf 里加上

[client]

default-character-set=utf8mb4

[mysql]

default-character-set=utf8mb4

因为编译时默认已经使用了utf8mb4,其他地方不需设置


1.ERROR 1071 (42000) at line 35: Specified key was too long; max key length is 1000 bytes

varchar(255) ,最大存储为 255*4=1020 超过最大限制 1000

因此需要改小: varchar(249)

2.错误现象“Specified key was too long; max key length is 767 bytes” innodb 该怎么解决?

对于varchar(256)个字符的字段,没有必要做那么长的索引,可以阶段的,修改为:

字段如下: f_type int(11), f_key varchar(256), PRIMARY KEY(f_type,f_key(40))

备注:这样修改之后可能有一些风险哦,因为作为主键必须唯一,可能出现问题的情况,毕竟只截断了40个字符

对于InnoDB引擎的表,不建议你们使用此类组合模式做主键,性能会很差,建议数值类型的字段作主键,外加 创建唯一索引的模式,例如:

id INT UNSIGNED AUTO_INCREMENT,f_type int(11), f_key varchar(256), PRIMARY KEY(ID),UNIQUE KEY(f_type,f_key(80))


3.MySQL错误“Specified key was too long; max key length is 1000 bytes”的解决

经过查询才知道,是Mysql的字段设置的太长了,于是我把这两个字段的长度改了一下就好了。

建立索引时,数据库计算key的长度是累加所有Index用到的字段的char长度后再按下面比例乘起来不能超过限定的key长度1000:

latin1 = 1 byte = 1 character

uft8 = 3 byte = 1 character

uft8mb4 = 4 byte = 1 character

gbk = 2 byte = 1 character

举例能看得更明白些,以GBK为例:

CREATE UNIQUE INDEX `unique_record` ON reports (`report_name`, `report_client`, `report_city`);

其中report_name varchar(200), report_client varchar(200), report_city varchar(200)

(200 + 200 +200) * 2 = 1200 > 1000,所以就会报1071错误,只要将report_city改为varchar(100)那么索引就能成功建立。

如果表是UTF8字符集,那索引还是建立不了。



错误提示:

mysql: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file

vi /usr/share/mysql/charsets/Index.xml

#增加
<charset name="utf8mb4">
  <family>Unicode</family>
  <description>UTF-8 Unicode</description>
  <alias>utf-8</alias>
  <collation name="utf8_general_ci"     id="33">
   <flag>primary</flag>
   <flag>compiled</flag>
  </collation>
  <collation name="utf8_bin"            id="83">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
最近发表
标签列表