utf8mb4_unicode_ci是基于官方的Unicode规则进行排序和压缩,其算法相对负责,对于大部分的语言和字符集排序有着很高的准确率而uft8mb4_general_ci可以理解为一种为了提升速度的简化版Unicode规则,但由于它不完全遵循Unicode规则,在使用某种特定语言或者字符集时,会出现非预期的结果。
例:
总结:
UTF-8编码的字符可以是1-4个字节,但是在MySQL中最大只能存储3个字节。
在版本5.5开始引入innodb_large_prefix,其默认值为off,索引的前缀最大限制为767个字节;若值为on时(版本5.7.7开始作为默认值),最大限制为3072个字节。
总结:
在后期版本 innodb_large_prefix 将会被逐渐废弃并移除。从版本8.0开始,索引长度限制由表字段(row format)决定,若为DYNAMIC或COMPRESSED时,限制值为3072;为REDUNDANT或COMPACT时,限制值为767。且row_format=dynamic时,长度3072是基于innodb_page_size=16KB,随着innodb_page_size的值按比例增减,其索引前缀长度也响应减小,如若为8KB时,长度为1536,因此在限制索引长度时,需根据使用的MySQL版本以及相应的参数进行配置决定。
可以利用rand函数排序源表数据,再插入回源表。请参考下列实验:假设有学生表存储数万行记录,结构如下
student(sid char(10) 主键,sname,sex,dob )
执行下面系列查询将原有记录打乱插入回学生表:
-- 创建一个结构与学生表结构相同的中间过渡表
create table s1 (sid char(10) primary key,
sname varchar(50),sex char(1),dob date)
-- 将学生表中的数据插入到s1
insert into s1 select * from student
-- 清空学生表
truncate table student
-- 将中间过渡表s1中的记录打乱插入回学生表
insert into student select * from s1 order by rand()
-- 删除过渡表
drop table s1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)