Почему текстовый столбец не имеет значения по умолчанию в MySQL?

Если вы попытаетесь создать столбец TEXT в таблице и присвоить ему значение по умолчанию в MySQL, вы получите сообщение об ошибке (по крайней мере, в Windows). Я не вижу причин, почему текстовый столбец не должен иметь значение по умолчанию. Документация MySQL не объясняется. Мне кажется нелогичным (и несколько разочаровывающим, так как я хочу значение по умолчанию!). Кто-нибудь знает, почему это не разрешено?

Ответ 1

Windows MySQL v5 выдает ошибку, но Linux и другие версии только вызывают предупреждение. Это необходимо исправить. WTF?

Также см. попытку исправить это как ошибку # 19498 в MySQL Bugtracker:

Брайс Несбитт 4 апреля 2008 года 16:36:
В MS Windows правило "no DEFAULT" является ошибкой, а на других платформах это часто является предупреждением. Хотя это не ошибка, вы можете попасть в ловушку от этого, если вы пишете код на платформе lenient, а затем запускаете его на строгой платформе:

Лично я рассматриваю это как ошибку. Поиск столбца "BLOB/TEXT" не может иметь значения по умолчанию "возвращает около 2,940 результатов в Google. Большинство из них - сообщения о несовместимости при попытке установить сценарии БД, которые работали в одной системе, но не другие.

Теперь я сталкиваюсь с той же проблемой в webapp, который я изменяю для одного из моих клиентов, изначально развернутого в Linux MySQL v5.0.83-log. Я запускаю Windows MySQL v5.1.41. Даже пытаясь использовать последнюю версию phpMyAdmin для извлечения базы данных, она не сообщает значение по умолчанию для рассматриваемого текстового столбца. Тем не менее, когда я пытаюсь запустить вставку в Windows (это отлично работает при развертывании Linux), я получаю сообщение об ошибке по умолчанию для столбца ABC. Я пытаюсь воссоздать таблицу локально с очевидным значением по умолчанию (на основе выбора уникальных значений для этого столбца) и в конечном итоге получить ох-полезный столбец BLOB/TEXT не может иметь значения по умолчанию.

Опять же, не поддерживать базовую совместимость между платформами является неприемлемым и является ошибкой.


Как отключить строгий режим в MySQL 5 (Windows):

  • Измените/my.ini и найдите строку

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    
  • Замените его

    sql_mode='MYSQL40'
    
  • Перезапустите службу MySQL (предположим, что это mysql5)

    net stop mysql5
    net start mysql5
    

Если у вас есть доступ к root/admin, вы можете выполнить

mysql_query("SET @@global.sql_mode='MYSQL40'");

Ответ 2

Без глубокого знания механизма mySQL я бы сказал, что это звучит как стратегия сохранения памяти. Я предполагаю, что причина этого абзаца в документе docs:

Каждое значение BLOB или TEXT представлено внутри отдельно выделенным объектом. Это противоречит всем другим типам данных, для которых хранение выделяется один раз за столбец при открытии таблицы.

Похоже, что предварительное заполнение этих типов столбцов приведет к использованию памяти и штрафам за производительность.

Ответ 3

Вы можете получить тот же эффект, что и значение по умолчанию, используя триггер

create table my_text

(
   abc text
);

delimiter //
create trigger mytext_trigger before insert on my_text
for each row
begin
   if (NEW.abc is null ) then
      set NEW.abc = 'default text';
   end if;
end
//
delimiter ;

Ответ 4

"Поддержка DEFAULT в столбцах TEXT/BLOB" это запрос функции в MySQL Bugtracker (ошибка № 21532).

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

Это не может быть исправлено в версии 5.0 MySQL, потому что, по-видимому, это может привести к несовместимости и dataloss, если кто-либо попытается передать базу данных назад и вперед между (текущими) базами данных, которые не поддерживают эту функцию, и любые базы данных, которые поддерживают эту функцию.

Ответ 5

Обычно я запускаю сайты в Linux, но я также разрабатываю их на локальной машине Windows. Я сталкивался с этой проблемой много раз и просто исправлял таблицы, когда сталкивался с проблемами. Вчера я установил приложение, чтобы помочь кому-то, и, конечно же, снова столкнулся с проблемой. Итак, я решил, что пришло время выяснить, что происходит, и нашел эту тему. Мне действительно не нравится идея изменить sql_mode сервера на более ранний режим (по умолчанию), поэтому я придумал простое (я думаю) решение.

Это решение, конечно же, потребует от разработчиков обернуть скрипты создания таблиц, чтобы компенсировать проблему MySQL, запущенную в Windows. Вы увидите похожие понятия в файлах дампа. Один BIG предупреждает, что это может/вызовет проблемы, если используется разделение.

// Store the current sql_mode
mysql_query("set @orig_mode = @@global.sql_mode");

// Set sql_mode to one that won't trigger errors...
mysql_query('set @@global.sql_mode = "MYSQL40"');

/**
 * Do table creations here...
 */

// Change it back to original sql_mode
mysql_query('set @@global.sql_mode = @orig_mode');

Что об этом.

Ответ 6

Для Ubuntu 16.04:

Как отключить строгий режим в MySQL 5.7:

Редактировать файл /etc/mysql/mysql.conf.d/mysqld.cnf

Если в mysql.cnf

существует строка ниже,
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Затем замените его на

sql_mode='MYSQL40'

В противном случае

Просто добавьте строку ниже в mysqld.cnf

sql_mode='MYSQL40'

Эта разрешенная проблема.

Ответ 7

Что именно вы делаете? Быстрый тест показал, что текстовый столбец вполне может иметь значение по умолчанию:

    mysql> create table test (a char(32) not null default 'this works', b char(32) not null);
    Query OK, 0 rows affected (0.03 sec)
    mysql> insert into test (b) values('hello');
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from test;

+------------+-------+
| a          | b     |
+------------+-------+
| this works | hello |
+------------+-------+
1 row in set (0.00 sec)