【问题标题】:Laravel int to 32-bit binary (and vice versa)Laravel int 到 32 位二进制(反之亦然)
【发布时间】:2021-06-23 03:03:34
【问题描述】:

试图用 32 位二进制数创建列

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('test_binary', function (Blueprint $table) {
        $table->increments('id');
        $table->char('binary_number', 32)->charset('binary'); // From: https://stackoverflow.com/a/62615777/5675325
        $table->timestamps();

    });
}

$table->char('binary_number', 32)->charset('binary');

当我通过 HeidiSQL 查看它时,我可以看到它的类型为 BINARY,大小为 32。

在创建播种机以填充所需数据时,我尝试过

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
   DB::table('test_binary')->insert([
    'id' => 1,
    'binary_number' => 2,
    'created_at' => now(),
    'updated_at' => now()
    ]);

事实证明,如果我在binary_number 中使用 2 或 101,我将得到 DB 中的结果分别为 2 或 101。

当我尝试000000000000000000000000000000000010(在 32 位二进制中等于 2)和000000000000000000000000000001100101(在 32 位二进制中等于 101)时

'binary_number' => 00000000000000000000000000000010,

然后我分别得到值 8 和 294977。

但是,我正在寻找的是将 2 存储为 0000000000000000000000000000000000000010 并将 101 存储为 000000000000000000000000000001100101

【问题讨论】:

    标签: php mysql laravel binary


    【解决方案1】:

    您看到的是以 8 为基数编码的数字,这是因为您在它前面加上一个 0(后面跟着更多的 0),这使得 010 以 8 为基数 == 8 以 10 为基数。

    在 PHP 中表示一个数字是二进制使用 0b10 所以你的代码是:

    'binary_number' => 0b00000000000000000000000000000010, // this is 2 in decimal
    

    如果您想将十进制数 10 存储在数据库中,只需使用:

    'binary_number' => 10,
    

    请注意,似乎是在数据库端进行二进制转换,因此如果您不想传递二进制数,则实际上不需要传递。

    如果你想将数字强制转换为给定长度的二进制字符串,你可以使用

    $binaryString = str_pad(base_convert(2, 10, 2),32,'0',STR_PAD_LEFT);  // '00000000000000000000000000000010'
    

    更多详情https://www.php.net/manual/en/language.types.integer.php

    【讨论】:

    • 如果我想将2 存储为0000000000000000000000000000000000000010 怎么办?
    • 谢谢。欢迎您回答herehere,我会翻译成西班牙语和葡萄牙语(以防您不知道如何)。
    • 我认为您可以在此处复制此答案,如果您愿意,也可以链接回此处。顺便提一下,对于 BINARY 字符集在 HeidiSQL 中的实际含义可能存在误解。它不打算用于二进制数字,而是二进制字符串,即没有任何与之关联的字符编码的字符串。
    • 我刚刚完成并在此处链接。你有什么建议?
    • 我认为 bit 是你需要的,虽然我不完全确定 Laravel 是否支持,所以你可能需要使用 DB::raw("b'000000010'") 将数据插入位列
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2011-11-15
    • 2012-09-18
    相关资源
    最近更新 更多