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>