我正在使用Laravel并且有一个选择使用DB::raw() SUM()列的查询:
DB::raw("SUM(points) as game_points")
我已经安装了mysqldn和AFAIK Laravel使用的PDO.
但game_points无论列的类型是什么,都是一个字符串.(这是一个整数列)
如果我这样做:
DB::raw("COUNT(id) as foo_bar")
foo_bar 以整数形式返回.
这是有点共同的知识与不同版本的PHP和MySQL,并通过使用本地预处理语句或模拟预处理语句,可以有natine值类型或没有,像这样:
$value = $db->query("SELECT 1033 AS Code")->fetch(PDO::FETCH_COLUMN)
$value2 = $db->query("SELECT '1033' AS Code")->fetch(PDO::FETCH_COLUMN);
//PDO::ATTR_EMULATE_PREPARES set to true:
var_dump($value); // string(4) "1033"
var_dump($value2); // string(4) "1033"
//PDO::ATTR_EMULATE_PREPARES set to false:
var_dump($value); // int(1033)
var_dump($value2); // string(4) "1033"
Run Code Online (Sandbox Code Playgroud)
从这篇文章:
问题是 PDO 由于类型转换为字符串而导致 zval-separation。转换由 PDO 核心请求。
默认情况下,PDO 将始终将数据转换为字符串,并且 PDO_MYSQL 驱动程序只能通过返回 zval 来解决此 PDO 默认值。
为什么 PDO 总是将数据转换为字符串?
编辑。这个问题属于 SQLite 而不是 MySQL。
请注意,以下查询返回 string(3) "123",而不是整数。
$db = new \PDO("sqlite:".__DIR__."/db/trends.db");
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$stmt=$db->prepare('INSERT INTO trends(timestamp,data) VALUES (?,?)');
$stmt->execute([123,'Hello']);
$stmt=$db->prepare('SELECT timestamp FROM trends WHERE data=?');
$stmt->execute(['Hello']);
var_dump($stmt->fetchColumn()); // string(3) "123"
Run Code Online (Sandbox Code Playgroud)
$db = new \PDO("sqlite:".__DIR__."/db/trends.db");
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$stmt=$db->prepare('INSERT INTO trends(timestamp,data) VALUES (?,?)');
$stmt->execute([123,'Hello']);
$stmt=$db->prepare('SELECT timestamp FROM trends WHERE data=?');
$stmt->execute(['Hello']);
var_dump($stmt->fetchColumn()); // string(3) "123"
Run Code Online (Sandbox Code Playgroud) 我正在使用 MySQL 数据库在 Symfony 2.3 和 Doctrine 2.4 中做一个项目。
我有一个 FieldValue 实体(简化):
class FieldValue
{
/**
* The ID
*
* @var integer
*/
protected $fieldValueId;
/**
* Id of associated Field entity
*
* @var integer
*/
protected $fieldId;
/**
* Id of associated user
*
* @var integer
*/
protected $userId;
/**
* The value for the Field that user provided
*
* @var string
*/
protected $userValue;
/**
* @var \MyProjectBundle\Entity\Field
*/
protected $field;
/**
* @var …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 14.04 LTS上使用PHP 5.5.9和MySQL 5.5.44以及mysqlnd 5.0.11-dev.以下声明未能准备:
$db->prepare("SELECT nr.x FROM (SELECT ? AS x) AS nr")
Run Code Online (Sandbox Code Playgroud)
尽管以下声明成功准备,但这是事实:
$db->prepare("SELECT nr.x FROM (SELECT '1337' AS x) AS nr")
Run Code Online (Sandbox Code Playgroud)
是什么导致这种差异?手册说"参数标记只能在数据值出现的地方使用,而不能用于SQL关键字,标识符等等." 但这是一个数据值.
在独立客户端中也会发生同样的事情:
mysql -uredacted -predacted redacted
-- Type 'help;' or '\h' for help.
SELECT nr.x FROM (SELECT '1337' AS x) AS nr;
-- x
-- 1337
-- 1 row in set (0.00 sec)
PREPARE workingstmt FROM 'SELECT nr.x FROM (SELECT ''1337'' AS x) AS nr';
-- Query OK, 0 rows affected …Run Code Online (Sandbox Code Playgroud)