# 1064 Ошибка создания таблицы в phpmyadmin в XAMPP с использованием datetime | timestamp - PullRequest
0 голосов
/ 18 ноября 2018

Мне не удается создать базовую таблицу в mySQL для отслеживания сообщений электронной почты, отправленных на существующий список адресов электронной почты в той же базе данных и в той же папке, включая (1) метку времени серийного номера (2) при отправке (3) тему письма (4) ) тело письма (5) источник письма.

Этот вопрос отличается от предыдущих на вашем сайте (который я подробно прочитал), потому что он ТАК БАЗОВЫЙ - я буквально создаю 3 основных типа полей и у меня такая глубокая ошибка, что я не могу двигаться дальше. Все остальные, которые я обнаружил, имеют либо более сложные соображения / факторы, такие как объединения, миграция и т. Д., Где ошибка заключалась в понимании пользователем этих сложных уровней или частично понятном или унаследованном коде, либо настоящих новичках, где кто-то не понимал основных тип данных или базовый синтаксис и обзор любой начинающей книги по MySQL / SQL помогут разобраться. Так что ни один не применим к этому случаю: чистый, простой случай уровня новичка с только настройками и выпадающими списками для выбора (мне не нужен синтаксис!), Где он не будет работать и, в общем-то, создает синтаксические ошибки!

Я использую XAMPP для OS X 5.6.19-0 [2016-03-04], версия mySQL - mariaDB, и я работаю на MacBook Air с использованием OS X Mavericks. Я основываю этот пример на третьей главе книги «HeadFirst PHP & MySQL», где, как всегда, я пытаюсь расширить пример, чтобы напрячь все свои силы понимания, только чтобы ударить в стену!

БД: 'elvis_store', таблица для создания: 'emails_sent'. Мой экран phpmyadmin выглядит следующим образом (разделенный запятыми и изображаемый аналогично нечисловому массиву, поскольку столбцы не учитывались при форматировании) - все безымянные столбцы / настройки остались пустыми по умолчанию:

Имя: электронная почта #; Тип: INT; Индекс: ИНДЕКС; A_I: [✔︎] (флажок установлен); Виртуальность: НАСТОЯЩИЙ.

Имя: date-time_sent; Тип: DATETIME; Виртуальность: НАСТОЯЩИЙ;

Имя: email_subject; Тип: VARCHAR (75); Виртуальность: НАСТОЯЩИЙ;

Имя: email_body; Тип: ТЕКСТ (65 535); Виртуальность: НАСТОЯЩИЙ;

Имя: sent_from_email; Тип: VARCHAR (75); Виртуальность: НАСТОЯЩИЙ;

ВСЕ ПОЛЯ: сопоставление: utf8_unicode_ci (каждый столбец / в целом) Тип MIME: текст / обычный

Система хранения: InnoDB

Перевод phpmyadmin в SQL:

CREATE TABLE `elvis_store`.`emails_sent` (
    `email` INT AS () PERSISTENT , 
    `date-time_sent` DATETIME AS () PERSISTENT ,
    `email_subject` VARCHAR(75) AS () PERSISTENT , 
    `email_body` TEXT AS () PERSISTENT , 
    `sent_from_email` VARCHAR(75) AS () PERSISTENT , 
    INDEX (`email`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Я получаю # 1064 эту ошибку, когда нажимаю кнопку «Сохранить» внизу или кнопку «Перейти» вверху:

"# 1064 - у вас ошибка в синтаксисе SQL; обратитесь к руководству, соответствующему вашей версии сервера MariaDB, чтобы узнать правильный синтаксис для использования рядом с ') PERSISTENT, date-time_sent DATETIME AS () PERSISTENT, email_subject VA 'в строке 1 "

Вариации в ошибке # 1064, основанные на попытке многих опций, которые могут иметь смысл для меня, ВСЕГДА упоминайте имена, значения и т. Д. «TIMESTAMP» / «DATETIME», так что, скорее всего, это проблема. Манипуляции со значениями DATETIME и временными метками являются центральными для функциональности моего веб-приложения, поэтому вопрос о том, как обрабатывать создание таблиц и столбцов с такими значениями - что можно и нельзя, - в центре моего вопроса, особенно потому, что я думаю, что у меня есть VARCHAR и Индекс INT работает в другой таблице и выполняется в той же книге.

Я попробовал следующее безрезультатно (все еще получаю ошибку # 1064):

  1. исключение "#" и "-" из имен полей - я не вижу, чтобы использованное мной сопоставление препятствовало использованию этих специальных символов;

  2. изменение типа date-time_sent с DATETIME на TIMESTAMP и DATE;

  3. изменение значения по умолчанию поля datetime / timestamp по умолчанию будет нулевым и или разрешать нулевые значения (если флажок установлен) в различных комбинациях;

  4. изменение (резкое уменьшение) размера текстового поля до 500 символов в случае, если это было проблемой с моей версией XAMPP / SQL / PHP

Я не вижу никаких степеней свободы, как это изменить, потому что:

  1. все поля должны быть постоянными - после отправки электронного письма

  2. письма должны иметь автоматически увеличивающийся индекс серийного номера,

  3. по умолчанию используется автоматическая отметка времени, создаваемая при отправке электронных писем;

  4. Сортировка должна быть формой utf для вероятно большого количества международных клиентов;

  5. Я не понимаю, почему phpmyadmin добавляет «AS ()» при создании SQL-эквивалента моих флажков и раскрывающихся списков, но, конечно, это не будет ошибкой, если система создает этот язык;

  6. Отметка времени должна иметь тип DATETIME, поскольку диапазон от 1000-01-01 до 9999-12-31 предпочтительнее, чем для более узкого диапазона типа TIMESTAMP (1970-01-01 00:00:01 UTC до '2038-01-19 03:14:07' UTC). Я не хочу планировать переписывание своего сайта с учетом того, что все метки времени не будут поддерживаться через 20 лет (2018–2038 гг.), Особенно если эти вопросы являются центральными для моего веб-приложения, если мне это не нужно.

Так что я застрял. Почему ошибки # 1064 и как я могу создать эту базовую таблицу?

Заранее спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Через несколько часов после публикации я подумал, что, возможно, значение datetime («date-time_sent») было отключено моим указанием «persistent», потому что это один из единственных спецификаторов, оставшихся для удаления, и, возможно, он был разработан по умолчанию для постоянствакакой-то - зачем метка времени, если вы не собираетесь хранить эту информацию?Я понял, что это может быть шаблоном: ненужные спецификаторы могут сбить вас с толку при создании таблицы MySQL.

Когда-то у меня была проблема с созданием таблицы в той же настройке mariaDB XAMPP, где дополнительный спецификатор - в этом случаеавтоматически увеличенный индекс INT, обозначенный как «unsigned» (логический, верно?, поскольку он должен начинаться с нуля и идти в положительном направлении), вызывал сообщения об ошибках, пока не был удален.Очевидно, что MySQL (в данном случае mariaDB) знает, что индексы должны начинаться с нуля, чтобы избыточный спецификатор не только не был нужен, он также заблокировал создание таблицы.Точно так же в этом случае mySQL по умолчанию знает, как хранить и сохранять значения без указания «постоянный».

Как уже упоминалось в ответе на комментарий выше, я удалил все спецификаторы "virtuality", начиная со столбца datetime ("date-time_sent"), считая его уникальным, и ошибки перемещались до тех пор, пока не были удалены все спецификаторы Virtuality и не была создана таблица.,Как упомянуто выше, в этом случае я неправильно понял, что значение по умолчанию в Virtuality означает сохраненное, постоянное значение, которое просто не вычисляется, поэтому это были не избыточные / ненужные спецификаторы, а скорее неверное понимание спецификаторов (см. Ответ выше).Тем не менее, я думаю, что в этом есть урок в сочетании с этой предыдущей проблемой: добавленные спецификаторы при создании таблиц mySQL могут стать источником необъяснимых в противном случае ошибок, и эти спецификаторы должны быть удалены, а значения по умолчанию для mySQL проверены, даже если настройки по умолчанию кажутся новым разработчикам.как я, чтобы быть необходимым, потому что иногда это не так.

0 голосов
/ 18 ноября 2018

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

Поддерживающими их механизмами хранения являются InnoDB, Aria, MyISAM и CONNECT

Исходя из вашей основной таблицы и вопроса, я понимаю, что вы хотите иметь возможность добавлять данные самостоятельно, при использовании моего создания таблицы администратора php вам не требуется ввод для всех столбцов в структуре, избегайте По умолчанию, Сортировка, Атрибуты, Индекс, Жизнеспособность, MIME-тип и Преобразование браузера ; при создании базовой таблицы вы можете добавить те, которые вам нужны при изменении таблицы.

все поля должны быть постоянными - после отправки электронного письма

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

https://mariadb.com/kb/en/library/generated-columns/

Рабочий запрос для вашей таблицы будет

CREATE TABLE `elvis_store`.`emails_sent` (
    `email` INT, 
    `date-time_sent` DATETIME,
    `email_subject` VARCHAR(75), 
    `email_body` TEXT, 
    `sent_from_email` VARCHAR(75) , 
    INDEX (`email`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
...