PHP7连接并使用人大金仓数据库

安装人大金仓

注意事项

  • 设置不区分大小写

创建数据库


创建DEMO数据库后,默认也会自动创建PUBLIC模式,后续的新建表等操作会自动在PUBLIC模式中进行。

配置PHP(PDO接口)

下载接口文件

pdo_kdb_x64_for_php7.2.26.zip

注:该接口文件只适合于PHP7.2 TS X64版本,如果你使用的是其他版本的PHP,需要去人大金仓官网下载。

拷贝文件

php_pdo_kdb.dll文件拷贝至php的扩展目录下(扩展目录通过查看phpinfo里面的extension_dir值)

然后在php.ini的末尾添加一行:

extension=php_pdo_kdb.dll

打开命令行,输入php -m,如果提示:

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_kdb' (tried: xxxx/ext\pdo_kdb (找不到指定的模块。)

则需要把数据库安装目录下的D:\soft\Kingbase\ES\V8\Server\bin中的dll文件和D:\soft\Kingbase\ES\V8\jre\bin中的dll文件都拷贝至C:\Windows\System32目录下。

重启服务器,查看phpinfo,如果显示以下信息,则说明安装成功:

连接数据库

$dm_conf = array(
    'host'=> '127.0.0.1',
    'port'=> '54321',
    'db'=> 'DEMO',
    'db_user' => 'SYSTEM',
    'db_pwd'=> 'SYSTEM',
);
$pdo = new PDO("kdb:host=".$dm_conf['host'].";port=".$dm_conf['port'].";dbname=".$dm_conf['db']."",$dm_conf['db_user'],$dm_conf['db_pwd']);

创建表

$sql = 'create table "users"
    (
        "id" SERIAL primary key,
        "user_name" VARCHAR(20),
        "created_at" TIMESTAMP,
        "updated_at" TIMESTAMP DEFAULT now()::timestamp(0)
    )';
$result = $pdo->exec($sql);

注:smallserialserialbigserial不是真正的字段类型,它们只是为了创建唯一标识符列而存在的方便符号(类似MySQL数据库中支持的AUTO_INCREMENT属性)。
例如以下建表语句:

CREATE TABLE tablename (
id SERIAL
);

等价于

CREATE SEQUENCE tablename_id_SEQ;
CREATE TABLE tablename (
id integer NOT NULL DEFAULT nextval('tablename_id_SEQ')
);
ALTER SEQUENCE tablename_id_SEQ OWNED BY tablename.id;

插入数据

$sql = "insert into users (user_name,created_at,updated_at) values ('张三','2020-09-03 10:06:00','".date('Y-m-d H:i:s')."')";
$result = $pdo->exec($sql);

查询数据

$sql = "select * from users;";
$stmt = $pdo->prepare($sql);
if($stmt===false){
    var_dump($pdo->errorInfo());die;
}
$rs = $stmt->execute();
if ($rs) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        var_dump($row);
    }
}

更新数据

$sql = "update users set user_name = '李四' where id = 1";
$result = $pdo->exec($sql);

删除数据

$sql = "delete from users where id = 1";
$result = $pdo->exec($sql);

设置默认模式

通常情况下,在sql语句中的表名前需要指定模式名。例如上面例子中的users等价于public.users(因为public是默认模式),其中public就是模式名,users是表名。
可以通过SET search_path TO 模式名来更改当前模式。设置后,就会默认去设置的模式中找表。

  • 查看当前模式
SHOW search_path;

其他

  • 查询某个库下的所有表
SELECT * FROM sys_tables;
  • 查询当前时间
select now();

SELECT CURRENT_TIMESTAMP

如果只需要年月日时分秒:

SELECT now()::timestamp(0)
  • 查询表空间
 select * from sys_tablespace;
  • 查看表空间大小
 select sys_size_pretty(sys_tablespace_size('SYS_DEFAULT'));
  • 查询表的字段信息
SELECT a.attname,
   sys_catalog.format_type(a.atttypid, a.atttypmod),
   a.attnum,
   sys_catalog.col_description(a.attrelid, a.attnum),a.attnotnull
 FROM sys_catalog.sys_attribute a
 WHERE a.attnum > 0 AND NOT a.attisdropped and a.attrelid = 'test.users'::regclass::oid
 ORDER BY a.attnum;

注:test.users为表名。

  • 查询表的字段信息(包含字段默认值)
SELECT a.attname as "Field",
    format_type(a.atttypid, a.atttypmod) as "Type",
    a.attnum,
    col_description(a.attrelid, a.attnum) AS "Comment",
    b.adsrc as "Default",
    a.attnotnull AS "null"
FROM sys_attribute a LEFT JOIN sys_attrdef b ON a.attrelid = b.adrelid AND a.attnum = b.adnum
WHERE a.attnum > 0 AND a.attrelid = 'test.users'::regclass::oid
ORDER BY a.attnum;
  • 获取最后插入的自增ID的值
select currval('users_id_SEQ');

select lastval()

注:需要先执行插入语句,然后再执行该语句。users_id_SEQ为序列名。

  • 获取unix时间戳
SELECT to_number(extract(epoch from timestamp '2014-01-28 01:10:01'));

举例:
MySQL:

SELECT unix_timestamp(updated_at) FROM users where id = 1;

人大金仓:

SELECT to_number(EXTRACT(epoch FROM CAST(updated_at AS TIMESTAMP WITH TIME ZONE))) FROM users where id = 1;
  • 查看金仓版本号
SELECT version();

发表评论

邮箱地址不会被公开。 必填项已用*标注