MySQL字符排序

關於MySQL字符集 可以參考文章MySQL字符集 & 重談MySQL字符集

目錄

大小寫

  • _ci(case insensitive) 大小寫不敏感

  • _cs(case sensitive) 大小寫敏感

CREATE DATABASE IF NOT EXISTS collation_demo DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

USE collation_demo;

CREATE TABLE t1 (
id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
content varchar(255) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO t1 ( content ) VALUES ( 'china' );

INSERT INTO t1 ( content ) VALUES ( 'China' );
SELECT * FROM t1 WHERE content = 'china';
# Time: 0.018s
+----+---------+
| id | content |
+----+---------+
| 1  | china   |
| 2  | China   |
+----+---------+
SELECT * FROM t1 WHERE content = 'China';
# Time: 0.020s
+----+---------+
| id | content |
+----+---------+
| 1  | china   |
| 2  | China   |
+----+---------+
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_cs;
# (1273, "Unknown collation: 'utf8_general_cs'")

ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
# Query OK, 2 rows affected
SELECT * FROM t1 WHERE content = 'china';
# Time: 0.020s
+----+---------+
| id | content |
+----+---------+
| 1  | china   |
+----+---------+
SELECT * FROM t1 WHERE content = 'China';
# Time: 0.018s
+----+---------+
| id | content |
+----+---------+
| 2  | China   |
+----+---------+

比較規則

  • _bin 按位比較 (大小寫二進制值不同)

  • _general 按字節比較?

  • _unicode 按unicode規則比較

TRUNCATE t1;

ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO t1 ( content ) VALUES ( 'ij' );

INSERT INTO t1 ( content ) VALUES ( 'ij' );
SELECT * FROM t1 WHERE content = 'ij';
# Time: 0.018s
+----+---------+
| id | content |
+----+---------+
| 1  | ij      |
+----+---------+
SELECT * FROM t1 WHERE content = 'ij';
# Time: 0.017s
+----+---------+
| id | content |
+----+---------+
| 2  | ij       |
+----+---------+
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
SELECT * FROM t1 WHERE content = 'ij';
# Time: 0.061s
+----+---------+
| id | content |
+----+---------+
| 1  | ij      |
| 2  | ij       |
+----+---------+
SELECT * FROM t1 WHERE content = 'ij';
# Time: 0.020s
+----+---------+
| id | content |
+----+---------+
| 1  | ij      |
| 2  | ij       |
+----+---------+

unicode有更高的精度 但general有更高的效率

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章