安装人大金仓
注意事项
- 设置不区分大小写
创建数据库
创建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();