Принуждение типа MySql ENUM использовать 2 байта с начала - PullRequest
1 голос
/ 12 марта 2011

Я использую тип данных Enum в качестве первичного ключа, на который ссылается внешний ключ в другой таблице. Если мне нужно добавить дополнительный элемент к этому значению перечисления, я использую

ALTER TABLE <table> MODIFY <colName> ENUM(<OLD VALUES>, NEW VAL);

на обеих таблицах. Работает нормально.

У меня был один неясный пример, в котором я перешел от <255 значений к большему. В этом случае ENUM потребуется переключиться с 1-байтового хранилища на два байта. Вот когда это не удается. Дает мне </p>

ОШИБКА 1025 (HY000): Ошибка при переименовании './TXCAD/#sql-5912_86' в './TXCAD/EN_TABLE' (номер ошибки: 150)

Я провел небольшое исследование и обнаружил, что это преобразование из 1 байта в два байта в основной таблице приводит к несоответствию типа данных внешнего ключа. (Если я начну с 256+ значений, это вообще не произойдет. Я это проверил)

Есть ли способ заставить MySql использовать 2 байта с самого начала, даже если ENUM () имеет менее 255 значений при создании таблицы?

Использование MySql - 5.1 InnoDB таблицы

1 Ответ

1 голос
/ 12 марта 2011

Просто, чтобы вы знали, я довольно долго искал это.Из документов действительно видно, что единственный способ получить 2-байтовое перечисление во время создания таблицы - это способ, который вы упомянули ... то есть указать более 255 элементов в вашем списке перечисления.Я не вижу другой части таблицы, создающей синтаксис, который учитывает это.Ваша единственная надежда будет состоять в том, что есть параметр файла конфигурации, который включает другое значение по умолчанию.

Список системных переменных сервера существует, но я выполнил быстрый поиск и не увидел ссылку на такую, которая могла бы изменить поведение по умолчанию для размера поля перечисления.http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html (обратите внимание, эта страница очень велика и на мгновение повесила мой браузер.)

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

...