2014-02-04 5 views
7

Недавно я столкнулся с проблемой, вызванной опечаткой в ​​скрипте создания базы данных, в результате чего столбец в базе данных был создан как varchar(0) вместо varchar(20).Какова цель varchar (0)

Я ожидал, что я получил ошибку для строкового поля длиной 0 строк, но я этого не сделал. Какова цель varchar(0) или char(0), так как я все равно не смог бы хранить данные в этом столбце.

+1

Какие СУБД вы используете? – Kermit

+0

@FreshPrinceOfSO Этот конкретный случай был mysql - обновление вопроса. –

+2

Почему вы предполагаете, что это должно быть полезно, чтобы быть законным? – geoffspear

ответ

8

Это недопустимо по стандарту SQL-92, но разрешено в MySQL. От MySQL manual:

MySQL позволяет создать столбец типа CHAR(0). Это полезно, прежде всего, когда вы должны быть совместимы со старыми приложениями, которые зависят от существования столбца, но фактически не используют его значение. CHAR(0) также очень приятно, когда вам нужен столбец, который может принимать только два значения: столбец, который определяется как CHAR(0) NULL занимает только один бит и может принимать только значения NULL и '' (пустая строка).

3

Как они подобные типы, char и varchar, я собираюсь рискну предположить, что потребительная случай varchar(0) такой же, как char(0).

Из документации String Types:

MySQL позволяет вам создать столбец типа CHAR (0). Это полезно в первую очередь, когда вы должны быть совместимы со старыми приложениями, которые зависят от наличия столбца, но фактически не используют его значение . CHAR (0) также неплохо, если вам нужен столбец, который может принимать только два значения: столбец, который определен как CHAR (0), NULL занимает только один бит и может принимать только значения NULL и '' (пустой строка).

4

Только что проверенный MySQL, это правда, что он допускает CHAR и VARCHAR нулевой длины.

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

+0

то почему бы не удалить этот столбец? Я думаю, что удаление столбца может потребоваться для изменения кода приложения ... –

+1

Я уже сказал «вы не хотите сломать существующий код, который что-то там пишет» –

+0

У меня было такое же предположение, поэтому я + ваш ответ, я думаю, добавьте эту строку в вашем ответе, если хотите. –

0

Это полезно в сочетании с уникальным индексом, если вы хотите пометить одну конкретную строку в своей таблице (например, поскольку она используется по умолчанию). Уникальный индекс гарантирует, что все остальные строки должны быть null, поэтому вы всегда можете получить строку по этому столбцу.

0

Вы можете использовать его для хранения значений типа boolean.

Посмотрите следующий код:

mysql> create table chartest(a char(0)); 
Query OK, 0 rows affected (0.26 sec) 

mysql> insert into chartest value(NULL); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into chartest value(''); 
Query OK, 1 row affected (0.00 sec) 

mysql> select 'true' from chartest where a is null; 
+------+ 
| true | 
+------+ 
| true | 
+------+ 
1 row in set (0.00 sec) 

mysql> select 'false' from chartest where a is not null; 
+-------+ 
| false | 
+-------+ 
| false | 
+-------+ 
1 row in set (0.00 sec) 

Можно использовать NULL, чтобы представить истинный и '' (пустая строка), чтобы представить false!

Согласно справочному руководству MySQL, только NULL занимает один бит.

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