2013-02-12 3 views
0
CREATE SCHEMA IF NOT EXISTS `utftest` DEFAULT CHARACTER SET utf16; 
CREATE TABLE IF NOT EXISTS `metadata_labels` (`metadata_id` INT NOT NULL , `label` VARCHAR(256) NOT NULL , PRIMARY KEY (`metadata_id`, `label`)); 

однако я получаю следующее сообщение об ошибке Сообщ:mySQL VARCHAR (256) + mySQL INT = сколько байтов?

Specified key was too long; max key length is 767 bytes 

Пожалуйста посоветуйте

+0

Только протестированные это, и это, кажется, работает хорошо? – David

+0

Если возможно, вы должны использовать значение auto incrementing integer или GUID вместо очень длинного varchar в качестве первичного ключа – Patashu

ответ

1

UTF 16 использует 32 bits per character (4 байта) в MySQL. 4 x 256> 767.

Если возможно, я бы рекомендовал использовать что-то другое, кроме UTF16 VARCHAR для вашего ключа.

+0

, и что же такое параметры? Мне нужно использовать UTF для поддержки международных символов и специальных символов ....... –

+0

Это необходимо для ключа? –

+0

Да, нам нужно поддерживать международные символы в метаданных_labels.label –

1

В UTF8 для этого потребуется 3 x 256 + 4 = 772 байт. UTF16 займет еще 25%.

Вы не должны использовать первичный ключ, который является настолько широким; для того, чтобы индекс был эффективным, хранилище для каждого индекса должно быть сведено к минимуму.

Если вам нужно предотвратить дубликаты, я бы рекомендовал добавить вычисленное поле, содержащее хэш содержимого (например, sha1) и создать вместо него уникальное ограничение.

В качестве альтернативы используйте latin1 в качестве символьной кодировки для поля label, чтобы уменьшить количество байтов до 256 + 4 = 300.

Если Unicode является обязательным и хэши из картины вы должны уменьшить столбец либо UTF8 (250 символов) или UTF16 (190 символов)

+0

Где вы получаете 3? –

+0

@JasonMcCreary utf8 может потребовать от 1 до 3 байтов хранения для каждого символа. –

+0

Есть ли способ, когда мне не нужно добавлять другое поле (хэш)? –

Смежные вопросы