MySQL MyIsam 存儲引擎在創(chuàng)建索引的時候,索引鍵長度是有一個較為嚴格的長度限制的,所有索引鍵最大長度總和不能超過1000,而且不是實際數(shù)據(jù)長度的總和,而是索引鍵字段定義長度的總和。下面做個簡單的測試,記錄一下。 root@sky:~# mysql -u sky -p -h127.0.0.1 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 44 Server version: 5.0.51a-log MySQL Community Server (GPL) Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer. sky@127.0.0.1 : (none) 05:23:08> use test; Database changed sky@127.0.0.1 : test 05:23:11> sky@127.0.0.1 : test 05:23:12> 先創(chuàng)建一個MyIsam表,字符集選擇latin1,三個字段均設(shè)置為varchar 255,: sky@127.0.0.1 : test 05:23:12> create table test_ind -> (a varchar(255), -> b varchar(255), -> c varchar(255) -> ) engine=myisam charset=latin1; Query OK, 0 rows affected (0.01 sec) 創(chuàng)建效果: sky@127.0.0.1 : test 05:23:32> show create table test_ind\G *************************** 1. row *************************** Table: test_ind Create Table: CREATE TABLE `test_ind` ( `a` varchar(255) default NULL, `b` varchar(255) default NULL, `c` varchar(255) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 1 row in set (0.00 sec) 三個字段聯(lián)合索引(長度應(yīng)該在1000以內(nèi)) sky@127.0.0.1 : test 05:23:41> create index test_a_b_c_ind on test_ind(a,b,c); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 我們看到,創(chuàng)建成功了。 下面我們做一次字符集轉(zhuǎn)換,將字符集轉(zhuǎn)換成utf8 sky@127.0.0.1 : test 05:25:54> alter table test_ind convert to charset utf8; ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes sky@127.0.0.1 : test 05:26:24> sky@127.0.0.1 : test 05:28:03> show create table test_ind\G *************************** 1. row *************************** Table: test_ind Create Table: CREATE TABLE `test_ind` ( `a` varchar(255) default NULL, `b` varchar(255) default NULL, `c` varchar(255) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 1 row in set (0.00 sec) 結(jié)果報錯了,查看表實際情況也確實沒有成功,仍然是latin1的字符集。 我們現(xiàn)drop掉索引,再轉(zhuǎn)換字符集。 sky@127.0.0.1 : test 05:28:10> drop index test_a_b_c_ind on test_ind; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 sky@127.0.0.1 : test 05:28:15> alter table test_ind convert to charset utf8; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 sky@127.0.0.1 : test 05:28:20> show create table test_ind\G *************************** 1. row *************************** Table: test_ind Create Table: CREATE TABLE `test_ind` ( `a` varchar(255) default NULL, `b` varchar(255) default NULL, `c` varchar(255) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec) 轉(zhuǎn)換很順利,成功了。 現(xiàn)在再創(chuàng)建索引看看效果怎樣: sky@127.0.0.1 : test 05:28:36> create index test_a_b_c_ind on test_ind(a,b,c); ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 失敗,減少索引鍵字段 sky@127.0.0.1 : test 05:28:54> create index test_a_b_c_ind on test_ind(a,b); ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 還是失敗,繼續(xù)減少 sky@127.0.0.1 : test 05:29:00> create index test_a_b_c_ind on test_ind(a); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 ok,總算成功了。 最后再看看其他存儲引擎有沒有這個限制呢?就看當(dāng)前用的最廣泛的存儲引擎之一Innodb吧: sky@127.0.0.1 : test 05:29:03> drop index test_a_b_c_ind on test_ind; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 sky@127.0.0.1 : test 05:29:54> sky@127.0.0.1 : test 05:29:58> sky@127.0.0.1 : test 05:30:11> alter table test_ind engine=innodb; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 sky@127.0.0.1 : test 05:31:15> show create table test_ind\G *************************** 1. row *************************** Table: test_ind Create Table: CREATE TABLE `test_ind` ( `a` varchar(255) default NULL, `b` varchar(255) default NULL, `c` varchar(255) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) sky@127.0.0.1 : test 05:31:23> create index test_a_b_c_ind on test_ind(a,b,c); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 很順利,創(chuàng)建成功,Innodb是沒有這個限制的。 |
|