как mysql распределяет длину ключа первичного или внешнего ключа?

Я создал таблицу с двумя разными типами кодировки: utf8 и latin1.

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 | исх | строка s | Экстра |

| 1 | ПРОСТО | ааа | исх | имя | имя | 258 | const | 2 | Используя где; Используя index |

1 ряд в комплекте (0,00 сек)

2)

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

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

| 1 | ПРОСТО | ааа | исх | имя | имя | 768 | const | 2 | Используя где; Используя index |

1 ряд в комплекте (0,01 сек)

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


person user1342336    schedule 17.04.2013    source источник


Ответы (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

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

person Markus Winand    schedule 18.04.2013
comment
Спасибо, это действительно имеет смысл. - person user1342336; 18.04.2013