【问题标题】:Laravel insert a bigint into mysql wrongLaravel 将 bigint 插入 mysql 错误
【发布时间】:2017-07-31 07:01:09
【问题描述】:

这是我的表结构

SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = '+07:00';
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `merchants`;
CREATE TABLE `merchants` (
`id` bigint(20) NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`address` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`work_hour` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我的模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
* @property $name
* Class Merchant
* @package App
*/
class Merchant extends Model
{

/**
 * The table associated with the model
 * @var string
 */
protected $table = "merchants";

//
protected $fillable = [
    "name", "url", "address", "work_hour", "id"
];

public $incrementing = false;
}

回显 PHP_INT_SIZE ;// 8 回声 PHP_INT_MAX ; // 9223372036854775807

每次,我插入新记录,ID 是 bigint,在 DB 中总是错误

$merchant->id = $newId1;
$merchant->name = $request->name;
$merchant->url = $request->url;
$merchant->address = $request->address;
$merchant->work_hour = 'a';
$merchant->created_at = date('Y-m-d h:i:s');
$merchant->updated_at = date('Y-m-d h:i:s');

$merchant->save();

$newId1 = 4550103638072627879;但它显示在mysql -2144066090

请帮忙

【问题讨论】:

    标签: mysql laravel eloquent bigint


    【解决方案1】:

    根本原因不是变量类型。是mysql的php扩展版本不对。

    检查您的 php 版本。如果是 7.0 以上,你应该使用 mysqlnd 驱动扩展而不是其他的。 mysqlnd驱动程序将解决与mysql相关的大整数和许多奇怪的问题。试试看。

    【讨论】:

      【解决方案2】:

      您必须将 bigints 存储为 string 或 float,因此请尝试将您的 bingint 值插入为字符串,否则请将数据类型更改为 varchar 来自 bigint

      【讨论】:

      • DB id 字段也是 bigint。
      • 是的,如果是 bigint,您应该将值存储为字符串而不是整数。
      • 为什么?因为PHP可以处理这个整数,mysql也可以,为什么要改成字符串呢? “加入”会发生什么?
      • 在您下面的评论中,您给出了 $merchant->id = (string) $newId1;那么这意味着您已将 $newId1 变量转换为字符串。通常如果值是整数,则不需要使用引号,通常 bigint 不会接受没有引号的值。所以你需要像带引号的字符串值一样插入 bigint 值。
      【解决方案3】:

      更改代码

      $merchant->id = (string) $newId1;
      

      效果很好。

      我不知道为什么:)

      【讨论】:

        【解决方案4】:

        遇到了同样的问题。我已经在使用 mysqlnd 扩展。将其保存为字符串就可以了。

        【讨论】:

          猜你喜欢
          • 2021-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-01
          • 2011-08-12
          • 2013-06-17
          • 2016-07-30
          • 1970-01-01
          相关资源
          最近更新 更多