2013-04-17 4 views
0

Я создал таблицу с двумя разными типами кодировки: utf8 и latin1.Как mysql выделяет длину ключа первичного ключа или внешнего ключа?

1)

CREATE TABLE `aaa` (
    `id` int(11) NOT NULL DEFAULT '0', 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

2)

CREATE TABLE `aaa` (
    `id` int(11) NOT NULL DEFAULT '0', 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Затем вставить значение в несколько рядов. При использовании 'объяснить', чтобы выбрать обе таблицы, я получил другую key_len:

1)

mysql> explain select count(*) from aaa where name = "haha"; 

| id | select_type | стол | тип | possible_keys | ключ | key_len | ref | строка s | Экстра |

| 1 | ПРОСТОЙ | aaa | ref | имя | имя | 258 | const | 2 | Использование где; Использование индекса |

1 строка в наборе (0,00 сек)

2)

mysql> explain select count(*) from aaa where name = "haha"; 

| id | select_type | стол | тип | possible_keys | ключ | key_len | ref | строка s | Экстра |

| 1 | ПРОСТОЙ | aaa | ref | имя | имя | 768 | const | 2 | Использование где; Использование индекса |

1 строка в наборе (0,01 сек)

я не знаю, каким образом системы выделяет key_len для аналогичных таблиц, которые были определены с использованием различных кодовым?

+0

MY EYESSSSSSSSSS – Scotch

ответ

1

Как utf8 это набор символов, мульти-байт, MySQL должен резервировать три байта для каждого символа:

utf8, a UTF-8 encoding of the Unicode character set using one to three bytes per character. 

http://dev.mysql.com/doc/refman/5.6/en/charset-unicode.html

Кроме того, там, кажется, три байта накладных расходов.

+0

Спасибо, это действительно имеет смысл. – user1342336