在 MySQL 枚举列中插入设置了错误的数据

Insert in MySQL enum column set the wrong data

这是我第一次使用MySQL枚举数据类型,所以我真的不知道如何正确插入这种类型的数据。我有一个 table 包含一个具有枚举类型的列(状态列),当我在此 table 中插入一行时,状态列将包含一个不是我插入的值,例如:

  define('INVALID_EMAIL_ADDRESS', 0);
  define('EMAIL_EXIST',           1);
  define('NO_MX_RECORDS',         2);
  define('EMAIL_NOT_EXIST',       3);
  define('EMAIL_CHECK_FAILS',     4);

$query_emails = mysqli_query($db_link, "SELECT email_id, email_address FROM emails");
  while ($email_row = mysqli_fetch_array($query_emails)) {
      $check_email = does_email_exist($email_row[1]);
      echo "status: " . $check_email . " " . $email_row[1] . "<br>";
      switch($check_email) {
        case INVALID_EMAIL_ADDRESS;
          //echo $check_email . " " . $email_row[1] . "<br>";
          $query = mysqli_query($db_link, "UPDATE mail_list SET status = " . INVALID_EMAIL_ADDRESS . " WHERE email_id = " . $email_row[0]);
          ++$num_invalid_emails;
        break;
        case EMAIL_EXIST;
          echo $check_email . " -- " . $email_row[1] . "<br>"; // this line get echoed
          $query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_EXIST . " WHERE email_id = " . $email_row[0]);
          ++$num_email_exist;
        break;
        case NO_MX_RECORDS;
          echo $check_email . " -- " . $email_row[1] . "<br>"; 
          $query = mysqli_query($db_link, "UPDATE mail_list SET status = " . NO_MX_RECORDS . " WHERE email_id = " . $email_row[0]);
          ++$num_no_mx_records;
        break;
        case EMAIL_NOT_EXIST;
          echo $check_email . " -- " . $email_row[1] . "<br>"; // this line get echoed too, but the other don't.
          $query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_NOT_EXIST . " WHERE email_id = " . $email_row[0]);
          ++$num_emails_not_exist;
        break;
        case EMAIL_CHECK_FAILS;
        default;
          $query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_CHECK_FAILS . " WHERE email_id = " . $email_row[0]);
          ++$num_email_check_fails;
        break;  
      }  
  }

在这个 table 中,一些电子邮件存在,而另一个不存在,我应该在 table 行中看到的内容:EMAIL_NOT_EXISTEMAIL_EXIST, 但我看到所有记录都有 NO_MX_RECORDS.

我做错了什么?

检查您的数据库以及您的枚举字段如何。

假设您使用的是 0 到 4 之间的值,我认为使用枚举是没有用的。使用 tinyint 代替。

如果你像

这样在数据库中设置你的字段状态,枚举就会变得有用
'NOT VALID MAIL', 'MAIL NOT EXIST' // and so on...

所以...选项是这样的:

1) 更改 table - 在 mysql 中更改字段类型

ALTER TABLE `myTable` MODIFY COLUMNS `status` tinyint(1);

如果您 运行 您的实际代码将起作用。

2) 更改代码

在定义中使用

define('INVALID_EMAIL_ADDRESS', 0);

这(对我来说)是一个完美的解决方案......无论如何......如果你的字段 ENUM 处于状态,它应该像之前的例子一样

'NOT VALID MAIL', 'MAIL NOT EXIST' // and so on...

所以你的定义将是

define('INVALID_EMAIL_ADDRESS', 'HOW I AM IN THE ENUM');

3) – Michał Przybyłowicz 说得对。为了获得更好的帮助和信息,您应该将枚举字段转储给我们,HERE 就是这样。