在 MySQL 数据库中,字符集和排序规则是处理文本数据的重要概念。utf8_general_ci 和 utf8_unicode_ci 是两种常见的 UTF - 8 字符集的排序规则。排序规则决定了如何对文本进行排序和比较,不同的排序规则会影响到数据的存储、查询和显示。了解它们之间的区别,有助于开发者根据具体需求选择合适的排序规则,以优化数据库性能和保证数据处理的准确性。
实现步骤
1. 创建测试表
1 2 3 4 5 6 7
CREATE TABLE test( ID INT(11) DEFAULTNULL, Description VARCHAR(20) DEFAULTNULL ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
2. 填充随机数据
1 2 3 4 5 6 7 8 9 10 11 12 13
CREATEPROCEDURE randomizer() BEGIN DECLARE i INTDEFAULT0; DECLARE random CHAR(20) ; theloop: loop SET random = CONV(FLOOR(RAND() *99999999999999), 20, 36); INSERT INTO test VALUES (i+1, random); SET i=i+1; IF i =500000THEN LEAVE theloop; END IF; END LOOP theloop; END
3. 创建基准测试存储过程
简单查询基准测试
1 2 3 4 5 6 7 8 9 10 11 12 13
CREATEPROCEDURE benchmark_simple_select() BEGIN DECLARE i INTDEFAULT0; theloop: loop SELECT* FROM test WHERE Description ='test'COLLATE utf8_general_ci; SET i = i +1; IF i =30THEN LEAVE theloop; END IF; END LOOP theloop; END;
LIKE 查询基准测试
1 2 3 4 5 6 7 8 9 10 11 12 13
CREATEPROCEDURE benchmark_select_like() BEGIN DECLARE i INTDEFAULT0; theloop: loop SELECT* FROM test WHERE Description LIKE'%test'COLLATE utf8_general_ci; SET i = i +1; IF i =30THEN LEAVE theloop; END IF; END LOOP theloop; END;
排序查询基准测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14
CREATEPROCEDURE benchmark_order_by() BEGIN DECLARE i INTDEFAULT0; theloop: loop SELECT* FROM test WHERE ID >FLOOR(1+ RAND() * (400000-1)) ORDERBY Description COLLATE utf8_general_ci LIMIT 1000; SET i = i +1; IF i =10THEN LEAVE theloop; END IF; END LOOP theloop; END;