PHP执行PostgreSQL含double precision类型转换的CREATE TABLE语句时出现语法错误的问题咨询
问题分析与解决办法
首先,从你给出的错误信息能发现关键线索:你写的SQL里是-20.12::double precision,但报错时的SQL却变成了-20.12::numeric precision——这说明你的SQL语句在PHP代码传递到PostgreSQL的过程中被偷偷篡改了,这才是语法错误的根源(numeric precision是无效的PostgreSQL语法,正确写法应该是numeric(precision, scale)或者直接double precision)。
可能的原因
- 你的数据库连接封装代码(也就是
mydataQuery.php里的逻辑)存在字符串替换/过滤逻辑,比如误把double替换成了numeric,这是最有可能的情况。 - 你使用的PHP PostgreSQL扩展(比如
pgsql或pdo_pgsql)版本过旧,对PostgreSQL的::类型转换语法处理有bug。 - 旧环境中启用了早已废弃的
magic_quotes之类的配置,意外修改了SQL字符串内容。
可行的解决办法
检查
mydataQuery.php的代码逻辑
仔细查看这个文件里的数据库查询方法(比如query函数),有没有对传入的SQL语句做字符串替换、正则匹配之类的操作。比如有没有类似str_replace('double', 'numeric', $sql)的代码,这会直接把double precision改成numeric precision,导致语法错误。如果有,删除或者修正这个逻辑。改用参数化查询
参数化查询不仅能避免SQL注入风险,还能防止SQL字符串被意外篡改。比如用PDO的写法:$stmt = $db->prepare('create table mydataI(net) as VALUES (?::double precision)'); $stmt->execute([-20.12]);或者用原生
pgsql扩展的写法:pg_prepare($db, 'create_table_stmt', 'create table mydataI(net) as VALUES ($1::double precision)'); pg_execute($db, 'create_table_stmt', [-20.12]);替换类型转换的写法
把PostgreSQL专属的::类型转换语法换成标准SQL的CAST写法,看看是否还会被篡改:$cc='create table mydataI(net) as VALUES (CAST(-20.12 AS double precision))';升级PHP的PostgreSQL扩展
如果是驱动版本问题,更新你的pgsql或pdo_pgsql扩展到最新稳定版,旧版本的驱动可能对PostgreSQL的新语法支持不佳。
内容的提问来源于stack exchange,提问作者George Kourtis
相关产品推荐
相关产品推荐

