SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.10.2007 00:36:39

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Похоже на багу...

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'

Неактивен

 

#2 31.10.2007 01:08:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Похоже на багу...

Вроде нормальное поведение - индекс не может быть на колонке нулевой длины.

Другой пример:

Код:

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.

Неактивен

 

#3 31.10.2007 01:22:26

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Похоже на багу...

Понял, спасибо, значит не бага


хотя мне это поведение все таки кажется странным. Более логичным было бы просто не создавать индекс, хотя...

Если я сделаю не char(0), а например varchar(1), оставив колонку таки пустой - то это неприятностей не вызовет, и индекс создастся, хотя и по все той же нулевой-длины колонке.

Отредактированно Shopen (31.10.2007 01:22:45)

Неактивен

 

#4 31.10.2007 01:25:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Похоже на багу...

А могу я узнать практическую ценность колонки CHAR(0)? smile

Неактивен

 

#5 31.10.2007 01:29:34

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Похоже на багу...

paulus написал:

А могу я узнать практическую ценность колонки CHAR(0)? smile

Конечно smile
автоматический разбор таблицы и сжатие ее типов.

т.е. я смотрю на максимальную длину строки в колонке и делаю ее alter table char/varchar(max_length)

а колонка возьми и окажись пустой. Т.е. в принципе конкретно это исключение можно обработать, но чем меньше исключений - тем проще логика

может какие то более интересные решения есть?

Неактивен

 

#6 31.10.2007 01:40:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Похоже на багу...

По-моему, достаточно бесполезная колонка smile

Хорошее сжатие типов должно подразумевать выкидывание колонки в принципе,
если в ней нет данных smile

Неактивен

 

#7 31.10.2007 01:52:51

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Похоже на багу...

paulus написал:

По-моему, достаточно бесполезная колонка smile

Хорошее сжатие типов должно подразумевать выкидывание колонки в принципе,
если в ней нет данных smile

Ну это в идеале. Я согласен.

Хитрость в том что есть задача, описанная здесь - http://sqlinfo.ru/forum/viewtopic.php?id=209
В рамках задачи СТРУКТУРА должна оставаться неизменной. То есть крайне высока вероятность того, что софт рассчитывает на существование колонки, даже если она не несет информации. В данный момент, а завтра там эта информация может появится.

Соответственно просто отрезать ее нельзя. я бы и рад, но в общем случае - нельзя.

Я так понимаю остается только varchar(1) unique key из оптимального

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson