安装人大金仓
注意事项
- 设置不区分大小写 
创建数据库

创建DEMO数据库后,默认也会自动创建PUBLIC模式,后续的新建表等操作会自动在PUBLIC模式中进行。
配置PHP(PDO接口)
下载接口文件
注:该接口文件只适合于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);
注:smallserial、serial和bigserial不是真正的字段类型,它们只是为了创建唯一标识符列而存在的方便符号(类似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();
