![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
mysql 5.0.18
CREATE TABLE `t10` ( `id` int(11) NOT NULL auto_increment, `value` char(1) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `value` (`value`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 ALTER TABLE `t10` MODIFY `value` CHAR(0) NOT NULL
--> The used storage engine can't index column 'value'
Неактивен

Вроде нормальное поведение - индекс не может быть на колонке нулевой длины.
Другой пример:
mysql> ALTER TABLE `t10` MODIFY `value` VARCHAR(10000) NOT NULL;
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> show warnings;
+---------+------+----------------------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------------------+
| Warning | 1071 | Specified key was too long; max key length is 1000 bytes |
+---------+------+----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table t10\G
*************************** 1. row ***************************
Table: t10
Create Table: CREATE TABLE `t10` (
`id` int(11) NOT NULL auto_increment,
`value` varchar(10000) NOT NULL,
PRIMARY KEY (`id`),
KEY `value` (`value`(1000))
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
1 row in set (0.00 sec)В этом случае, ограничение сервер обошел сам и сгенерил warning.
Неактивен
Понял, спасибо, значит не бага
хотя мне это поведение все таки кажется странным. Более логичным было бы просто не создавать индекс, хотя...
Если я сделаю не char(0), а например varchar(1), оставив колонку таки пустой - то это неприятностей не вызовет, и индекс создастся, хотя и по все той же нулевой-длины колонке.
Отредактированно Shopen (31.10.2007 01:22:45)
Неактивен

А могу я узнать практическую ценность колонки CHAR(0)? ![]()
Неактивен
paulus написал:
А могу я узнать практическую ценность колонки CHAR(0)?
Конечно ![]()
автоматический разбор таблицы и сжатие ее типов.
т.е. я смотрю на максимальную длину строки в колонке и делаю ее alter table char/varchar(max_length)
а колонка возьми и окажись пустой. Т.е. в принципе конкретно это исключение можно обработать, но чем меньше исключений - тем проще логика
может какие то более интересные решения есть?
Неактивен

По-моему, достаточно бесполезная колонка ![]()
Хорошее сжатие типов должно подразумевать выкидывание колонки в принципе,
если в ней нет данных ![]()
Неактивен
paulus написал:
По-моему, достаточно бесполезная колонка
Хорошее сжатие типов должно подразумевать выкидывание колонки в принципе,
если в ней нет данных
Ну это в идеале. Я согласен.
Хитрость в том что есть задача, описанная здесь - http://sqlinfo.ru/forum/viewtopic.php?id=209
В рамках задачи СТРУКТУРА должна оставаться неизменной. То есть крайне высока вероятность того, что софт рассчитывает на существование колонки, даже если она не несет информации. В данный момент, а завтра там эта информация может появится.
Соответственно просто отрезать ее нельзя. я бы и рад, но в общем случае - нельзя.
Я так понимаю остается только varchar(1) unique key из оптимального
Неактивен