mysql中如何将函数结果作为values值插入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中如何将函数结果作为values值插入?相关的知识,希望对你有一定的参考价值。

函数结果是一个多列字符串,比如str1,str2,str3这样,插入语句
insert into table select functino();

insert into table(column1,column2,...) values(value1,value2,...) 是插入定值数据的语法。

insert into table(column1,column2,...) select column1,column2,... from another_table 是动态从一个表中检出需要的字段数据插入到当前数据表的语法。

2种方式都要求 表中列数量及数据类型兼容
参考技术A 作曲:王立平作词:乔羽

使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值

【中文标题】使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值【英文标题】:Insert BIT value in MySQL using PDO Prepared Statement 【发布时间】:2014-10-23 13:42:45 【问题描述】:

如何?以下是我的尝试和结果。

<?php
function testIt($value)

    $sql='INSERT INTO test(id,data) VALUES(?,?)';
    $stmt=db::db()->prepare($sql);
    $stmt->execute(array(0,$value));
    $id=db::db()->lastInsertId();

    $sql='SELECT * FROM test WHERE id='.$id;
    $stmt=db::db()->query($sql);
    $rs=$stmt->fetch(PDO::FETCH_ASSOC);
    echo("Test for $value returns id $rs['id'] and data $rs['data']<br>");


date_default_timezone_set('America/Los_Angeles');
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once('../../ayb_private/dbase.php');

$sql='CREATE TEMPORARY TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, data BIT(8) NOT NULL DEFAULT 00000000, PRIMARY KEY (id) )';
$stmt=db::db()->exec($sql);

testIt('b"01010101"');
testIt('b01010101');
testIt('01010101');
testIt(0x55);
testIt("b'01010101'");
?>

结果:

Test for b"01010101" returns id 1 and data 255
Test for b01010101 returns id 2 and data 255
Test for 01010101 returns id 3 and data 255
Test for 85 returns id 4 and data 255
Test for b'01010101' returns id 5 and data 255

【问题讨论】:

testIt(0x55) 工作吗? @Barmar Test for 85 returns id 4 and data 255 嗯,也许你可以从这些问题中得到启示:***.com/search?q=pdo+prepare+title%3Abit 根据 mysql 文档,位文字格式是 b'01010101' - 你试过吗? @SamDufel 没有准备好的声明,db::db()-&gt;exec("INSERT INTO test(id,data) VALUES(0,b'01010101')"); 有效。我尝试将'b"01010101"' 更改为"b'01010101'",但没有任何变化。 【参考方案1】:

不在要检查的终端附近,但我相信您必须键入 bind 它到 INT 并将其作为 INT 发送,而不是“b010101”(或其他):

$sql='INSERT INTO test(id,data) VALUES(:id,:bit)';
$stmt=db::db()->prepare($sql);
$stmt->bindValue('id', null, PDO::PARAM_NULL);
$stmt->bindValue('bit', (int)$value, PDO::PARAM_INT);
$stmt->execute();

在 Google 上的快速检查发现了这个similar previous answer。

【讨论】:

使用您的解决方案和testIt(0x55); 似乎有效。而不是绑定,也许只是使用 PHP 转换二进制值可能有效? 这篇文章回答了这个问题,但确实提供了我想听到的答案。 PDO 似乎不适用于 BIT 值。由于这些值不是用户提供的,我想我可以手动将它们添加到我的查询中。或者可能将 BIT 类型全部丢弃并使用TINYINT(1)。想法? @user1032531 我记得,你不能通过 PDO 向 MySQL 发送一点:你最好总是发送一个整数,即使那样,如果你没有明确告诉 PDO使用整数,它作为字符串发送。如果您的用例是将位字段存储在数据库中,那么bindValue 整数表示并且它可以工作(如上)。如果您的用例是从一组已知的可能位字段中按位字段进行选择,只需在查询中直接对它们进行编码。 我的应用是一个基本的权限系统。我有一个代表 user_read/user_write/group_read/group_write/public_read/public_write 的 6 位值。我的 WHERE 子句将检查是否设置了字段的某些位。看来我可以用 TINYINT 做到这一点。同意?感谢您的帮助! @user1032531 - mysql SET 数据类型可能更适合您 - 它在内部映射到 mysql 作为位掩码检查,但允许您通过字符串标识符访问它。

以上是关于mysql中如何将函数结果作为values值插入?的主要内容,如果未能解决你的问题,请参考以下文章

如何将二进制值插入mysql

将十六进制值插入 MySql

使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值

如何将 PHP 数组中的值插入 MySQL 表?

触发器从多个表 MySQL 中插入多个数据

php如何将逗号分隔的多个json格式的字符串作为一个值插入到mysql表中? [复制]