Ошибка Mysql datetime DEFAULT CURRENT_TIMESTAMP
1.
Когда я запускал синтаксис MYSQL в окнах, он работал правильно.
CREATE TABLE New
(
id bigint NOT NULL AUTO_INCREMENT,
timeUp datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
)
Но когда я попытался запустить этот код в Linux, я получил сообщение об ошибке
#1067 - Invalid default value for 'time'
2.
В окнах корпус не чувствителен, например. Новые и новые оба считаются одинаковыми. Но на Linux дело чувствительно.
Конфигурация Linux
MySQL 5.5.33, phpMyAdmin 4.0.5 и PHP 5.2.17
Конфигурация Windows
MySql: 5.6.11, phpMyAdmin 4.0.4.1 PHP: 5.5.0
Это их способ сделать их общими для обеих систем. Или любой альтернативный подход. Спасибо за чтение.
Ответы
Ответ 1
Поддержка DEFAULT CURRENT_TIMESTAMP
для DATETIME
(типа данных) была добавлена в MySQL 5.6.
В 5.5 и более ранних версиях это применялось только к столбцам TIMESTAMP
(datatype).
Можно использовать триггер BEFORE INSERT
в 5.5, чтобы присвоить значение по умолчанию столбцу.
DELIMITER $$
CREATE TRIGGER ...
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
IF NEW.mycol IS NULL THEN
SET NEW.mycol = NOW();
END IF;
END$$
Чувствительность к регистру (запросов к значениям, хранящимся в столбцах) обусловлена collation
, используемой для столбца. Коллации, заканчивающиеся на _ci
, нечувствительны к регистру. Например, latin1_swedish_ci
нечувствителен к регистру, но latin1_general_cs
чувствителен к регистру.
Результат от SHOW CREATE TABLE foo
отобразит набор символов и сортировку для столбцов типа символов. Это указывается на уровне столбца. "Значение по умолчанию", указанное на уровне таблицы, применяется к новым столбцам, добавленным в таблицу, когда новое определение столбца не указывает набор символов.
удаp >
UPDATE
Кайи отметил, что мой ответ, касающийся "чувствительности к регистру", касается значений, хранящихся в столбцах, и будет ли запрос возвращать значение из столбца, содержащего значение "New"
, будет возвращен с предикатом типа "t.col = 'new'"
.
См. ответ Kaii относительно идентификаторов (например, имен таблиц), обрабатываемых по-разному (по умолчанию) в Windows, чем в Linux.
Ответ 2
По мере ответа на вопрос DEFAULT CURRENT_TIMESTAMP
я отвечу только на несоответствие чувствительности к регистру в именах таблиц между окнами и linux.
В Windows файловые системы по умолчанию не учитывают регистр.
Но в Linux и других * NIX, таких как операционные системы, по умолчанию они чувствительны к регистру.
Причина, по которой вы получаете несоответствие в поведении, - это файловая система, так как каждая таблица создается как отдельный файл, а файловая система обрабатывает чувствительность к регистру.
У MySQL есть параметр, чтобы переопределить это поведение:
Например, в Unix вы можете иметь две разные таблицы с именем my_table
и my_table
, но в Windows эти два имени считаются идентичными. Во избежание проблем с передачей данных, возникающих из буквенного регистра базы данных или имена таблиц, у вас есть два варианта:
-
Используйте lower_case_table_names=1
для всех систем. Основным недостатком этого является то, что при использовании SHOW TABLES
или SHOW DATABASES
вы делаете не видите имена в их исходном письме.
-
Используйте lower_case_table_names=0
в Unix и lower_case_table_names=2
в Windows. Это сохраняет регистр букв имен баз данных и таблиц. Недостатком этого является то, что вы должны убедиться, что ваши заявления всегда ссылайтесь на свою базу данных и имена таблиц с правильными регистр букв в Windows. Если вы передадите свои заявления в Unix, где регистр букв является значительным, они не работают, если буква неверно.
Исключение:. Если вы используете таблицы InnoDB и пытаетесь избежать этих проблем с передачей данных, вы должны установить lower_case_table_names=1
на всех платформах, чтобы заставить имена быть преобразованы в в нижнем регистре.
[...]
Чтобы избежать проблем, вызванных такими различиями, лучше всего принять согласованное соглашение, например, всегда создавать и ссылаясь на базы данных и таблицы, используя имена нижнего регистра. Эта рекомендуется использовать для максимальной переносимости и простоты использования.
Это выдержка из руководства MySQL по чувствительности к регистру идентификаторов
Ответ 3
если вы хотите, чтобы время по умолчанию менялось на timestamp
в вашем типе данных,
datetime
будет отображать пользовательский ввод таблицы...
http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html