【问题标题】:String data, right truncated: 1406 Data too long on Bit Column字符串数据,右截断:1406 位列数据太长
【发布时间】:2020-09-22 01:53:15
【问题描述】:

我最近刚刚添加了一个位列,由于某种原因,我无法编辑它的值。其他一切都很好。我在网上查找错误,有些人建议禁用严格模式,所以我做到了。感谢您查看我的问题。

我尝试使用SET sql_mode = ''; 禁用严格模式,但还是不行。

显示创建表 tbl_users;

| tbl_users | CREATE TABLE `tbl_users` (
  `user_id` int NOT NULL AUTO_INCREMENT,
  `user_role_id` int DEFAULT NULL,
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `admin_approved` bit(1) NOT NULL DEFAULT b'0',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

edit.php

<?php
//DB Connection
include 'conn.php';

if ($_POST['action'] == 'edit') {
    $data1 = [
        ':first_name' => $_POST['first_name'],
        ':last_name' => $_POST['last_name'],
        ':email' => $_POST['email'],
        ':admin_approved' => $_POST['admin_approved'],
        ':user_id' => $_POST['user_id'],
    ];

    $query1 = "
 UPDATE tbl_users
 SET first_name = :first_name,
 last_name = :last_name,
 email = :email,
 admin_approved = :admin_approved
 WHERE tbl_users.user_id = :user_id
 ";
    $statement = $connect->prepare($query1);
    $statement->execute($data1);
    //$statement->close();
    //echo json_encode($_POST);

    $result1 = mysqli_query($conn, $query1);
    if ($result) {
        echo "Successfully Edited";
    } else {
        echo "Error: " . $sql . "" . mysqli_error($conn);
    }
}



if ($_POST['action'] == 'delete') {
    $data2 = [
      ':user_id' => $_POST['user_id'],
  ];

    $query2 =
     "
DELETE FROM tbl_users
WHERE user_id = :user_id
";

    $statement = $connect->prepare($query2);
    $statement->execute($data2);
    //$statement->close();
    //echo json_encode($_POST);

    $result1 = mysqli_query($conn, $query2);
    if ($result) {
        echo "Successfully Deleetd";
    } else {
        echo "Error: " . $sql . "" . mysqli_error($conn);
    }
}

//echo json_encode($_POST);
?>

<?php
    foreach ($_POST as $key=>$post_data) {
        echo "You posted:" . $key . " = " . $post_data . "<br>";
    }
?>

错误信息:

<br />
<b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'admin_approved' at row 1 in /var/www/html/wordpress/multi_users/edit.php:23
Stack trace:
#0 /var/www/html/wordpress/multi_users/edit.php(23): PDOStatement-&gt;execute()
#1 {main}
  thrown in <b>/var/www/html/wordpress/multi_users/edit.php</b> on line <b>23</b><br />

【问题讨论】:

  • var_dump($_POST); admin_approved 包含什么?
  • 您的列admin_approved 不是布尔值,它是bit 类型。您不能在其中存储字符串或数字。
  • bit(1) 更改为inttinyint
  • @tadman OP 正在使用 PDO。
  • @Dharman 他们莫名其妙地使用了两者。

标签: php mysql


【解决方案1】:

数据类型BIT 只接受二进制值。您将长度指定为 1 位长,但您尝试输入值字符串 '1',二进制为 00110001,它显然会溢出。

在数据库中存储布尔值的推荐做法是使用可为空的 DateTime 数据类型。例如

`admin_approved` DATETIME DEFAULT NULL

然后,如果填充了该值,则您知道布尔状态为打开,如果该值为 NULL,则布尔状态为关闭。此外,您知道标志何时打开。

您也可以使用tinyint 并存储 1 或 0。但是,根据经验,我可以说它不是很有用。

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 2021-09-02
    • 2020-06-27
    • 2021-04-03
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多