ISO 8601格式的时间戳似乎存在问题。
我正在使用Microsoft ODBC驱动程序13 (预览)用于Server从64位Ubuntu16.04连接PHP7.0.8
这是我的简单桌子:
CREATE TABLE dtest (
"stamp" DATETIME
);作品:
$pdoDB = new PDO('odbc:Driver=ODBC Driver 13 for SQL Server;
Server='.DATABASE_SERVER.';
Database='.DATABASE_NAME,
DATABASE_USERNAME,
DATABASE_PASSWORD
);
$pdoDB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "INSERT INTO dtest (stamp) VALUES ('2011-03-15T10:23:01')";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);不起作用:
$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:01'];
$stmt->execute($params);致命错误: Uncaught : SQLSTATE22018:强制转换规范的无效字符值:0 MicrosoftInvalid字符值用于强制转换规范(SQLExecute at SQLExecute)
如果我删除以便'2011-03-15T10:23:01'变成'2011-03-15 10:23:01',那么就可以工作了
$sql = "INSERT INTO dtest (stamp) VALUES (?)";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15 10:23:01'];
$stmt->execute($params);但是我正在编写一个每晚运行在大约200万张记录上的脚本,所以我真的不愿意承担运行数百万str_replace('T', ' ', $param)的开销
我也尝试过使用bindParam,但是它给了相同的错误
$sql = "INSERT INTO dtest (stamp) VALUES (:tdate)";
$stmt = $pdoDB->prepare($sql);
$date = '2011-03-15T10:23:01';
$stmt->bindParam(':tdate',$date,PDO::PARAM_STR);
$stmt->execute();是否仍然可以按原样绑定和执行此参数?我对错误消息有点怀疑,因为它似乎来自SQL Server,好像PDO做得很好,但这是没有意义的,因为它能够在不进行参数化的情况下处理类型转换。
我还尝试过SQL转换:
作品:
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:02', 126))";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);不起作用:
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, ?, 126))";
$stmt = $pdoDB->prepare($sql);
$params = ['2011-03-15T10:23:02'];
$stmt->execute($params);发布于 2016-08-19 18:30:37
您将需要使用Server的内置convert()函数,并指定要给它的格式(126):
$sql = "INSERT INTO dtest (stamp) VALUES (CONVERT(DATETIME, '2011-03-15T10:23:01', 126))";文档在字符串末尾提到了:mmm,因此您可能需要在日期字符串的末尾手动添加:000才能工作。
发布于 2017-05-31 09:23:54
在花了半天时间试图解决同样的问题之后,我最终放弃了odbc,转而使用dblib。我安装了php7.0-sybase软件包,修改了我的PDO连接的数据源名称,并为所有人解决了一次。现在所有的束缚都在起作用。
https://stackoverflow.com/questions/39044034
复制相似问题