AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 23216
Accepted
ThinkingMonkey
ThinkingMonkey
Asked: 2012-08-28 09:33:13 +0800 CST2012-08-28 09:33:13 +0800 CST 2012-08-28 09:33:13 +0800 CST

PHP PDO(使用 libpq V 9.1.4)绑定以使用 CITEXT 的解决方法?

  • 772

场景

运行 PHP 和 PostgreSQL 的两个系统(不是服务器),版本如下

  • 软呢帽 15:

    PHP

    PHP 5.3.13 (cli) (built: May 9 2012 14:38:35)
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    pdo_pgsql
    PostgreSQL(libpq) 版本9.0.7
    模块版本 1.0.2


    PostgreSQL

    PostgreSQL 9.1.4
    启用 CITEXT 扩展。

  • ArchLinux:

    PHP

    PHP 5.4.6 (cli) (built: Aug 16 2012 12:50:09)
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    pdo_pgsql
    PostgreSQL(libpq) 版本9.1.4
    模块版本 1.0.2


    PostgreSQL

    PostgreSQL 9.1.4
    启用 CITEXT 扩展。


当一个简单的查询如

select column1 from schema1.table1 where column1= ? 

其中 column1 是 CITEXT 类型,通过 PHP PDO 执行

  • 在带有 PHP 5.3.13、libpq 9.0.7 的 Fedora 上,查询按预期执行 CITEXT(发生不区分大小写的搜索)。
  • 在带有 PHP 5.4.6、libpq 9.1.4 的 ArchLinux 上,使用 CITEXT 的查询没有按预期执行(发生区分大小写的搜索)。

我猜较新版本的 PHP PDO 库正在做类似的事情:

select column1 from schema1.table1 where column1= 'value'::text;

在绑定期间。

  • 我对吗?
  • 有解决方法吗?否则,在使用较新版本的 PDO 时,使用 CITEXT 作为列数据类型来获得不区分大小写搜索的优势是没有用的。

更新

开启语句级登录后,在 ArchLinux 上使用 PHP 5.4.6,libpq 9.1.4 :

LOG:  execute pdo_stmt_00000001: select column1 from schema1.table1 where column1 = $1
DETAIL:  parameters: $1 = 'value'
LOG:  statement: DEALLOCATE pdo_stmt_00000001

其中列的实际column1值为VALUE。

仍然返回 0 个元素。

当声明

select column1 from schema1.table1 where column1 = 'value';

直接在PSQL提示符下执行,返回单行。

 column1  
---------
  VALUE
 (1 row)

所以,类型转换不会发生!我仍然无法理解PDO/的行为postgresql。


更新 2012-08-27 16:15:43.669142+00 (UMT + 0)

在尝试直接执行查询而不准备语句之后。

这是用于测试的代码:

try {
    $db = new PDO('pgsql:dbname=database1;user=user;password=pass;host=localhost');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT column1 from schema1.column1 where column1 = 'value'::citext ";
    $retval=$db->query($sql);
    foreach ($retval as $row) {
        print $row['uname'] . '<br>';
    }
}catch (PDOException $PDOerr) {
    echo 'An error occured : <br>';
    var_dump($PDOerr);
    exit;
    //some thing went wrong while performing the action on db.
    }

我得到错误:

object(PDOException)#10 (8) { ["message":protected]=> string(211) "SQLSTATE[42704]: \
Undefined object: 7 ERROR: type "citext" does not exist LINE 1: ...

我不明白为什么citext没有被检测到!当语句直接在PSQL提示符下执行时,一切正常,如上所述。

postgresql php
  • 1 1 个回答
  • 1867 Views

1 个回答

  • Voted
  1. Best Answer
    Daniel Vérité
    2012-08-28T10:42:15+08:002012-08-28T10:42:15+08:00

    找到citext类型所在的命名空间:

    select nspname from pg_type t join pg_namespace n
      on n.oid=t.typnamespace where typname='citext';
    

    将该名称空间(通常为“公共”,但在您的情况下可能会有所不同,它可能会解释问题)添加到演员表中citext:

    $sql = "SELECT column1 from schema1.column1 where column1 = 'value'::public.citext";
    

    如果这解决了问题,但在某种程度上你觉得不优雅,你可能会重新考虑你是如何使用模式的,并且search_path:确保无论如何你的所有自定义类型都是可访问的。

    • 3

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve