PHP7连接并使用达梦数据库DM8

安装

DM8 windowsX64版下载地址:
https://eco.dameng.com/download/

创建数据库实例

  • 指定数据库名、实例名及端口号
  • 设置初始化参数
    字符集设置为UTF-8,去掉字符串大小写敏感

  • 设置密码

创建成功后,系统服务里面将新增加一个服务,如果需要删除该数据库时,需要先停止该服务:

管理数据库

新建模式

运行DM管理工具,连接localhot这个数据库,选中模式,右键,新建模式:

新建一个名为test的模式。

新建表

打开刚创建的test模式,选中表,右键,点击新建表:

新建一个名为users的表,注意设置id字段为主键,并可自增长。

选择新建的users表,右键,选择浏览数据

在右侧的数据窗口,可以任意录入几条测试数据,方便后面测试使用。

查询表数据

新建查询,输入sql语句,点击执行即可查看表数据:

select * from test.users

配置PHP(PDO接口)

由于目前最新版的达梦最高只支持到PHP 7.2版本,这里以7.2为例
(注:最新的版本已支持php7.4)

在达梦的安装包目录下找到pdo72_dm.dll(注意查看phpinfo,如果Thread Safetenabled,则选择该文件,否则选择pdo72nts_dm.dll

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

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

extension=pdo72_dm.dll

打开cmd命令行,输入php -m,如果提示PHP Fatal error: Unable to start DM module in Unknown on line 0错误:

尝试将数据库安装目录bin下的以下dll文件拷贝至C:\Windows\SysWOW64C:\Windows\System32,重新启动Apache。

dmdpi.dll
dmcalc.dll
dmelog.dll
dmmem.dll
dmos.dll
dmcomm.dll
dmcpr.dll
dmcyt.dll
dmstrt.dll
dmclientlex.dll
dmdta.dll
dmcfg.dll
dmdcr.dll
dmmout.dll
dmcvt.dll
dmmsg.dll

如果还不行就尝试把bin所有的dll文件拷贝过去。

连接数据库

date_default_timezone_set("Asia/Shanghai");
header("Content-type:text/html; Charset=utf-8");
$dm_conf = array(
    'host'=> '127.0.0.1:5236',  //连接地址及端口
    'db'=> 'DBNAME',  //数据库名
    'db_user' => 'SYSDBA', //用户名
    'db_pwd'=> '123456789', //密码
);
$pdo = new PDO("dm:host=".$dm_conf['host'].";dbname=".$dm_conf['db']."",$dm_conf['db_user'],$dm_conf['db_pwd']);

创建表

$sql = 'create table "test"."users"
(
    "id" INTEGER identity(1, 1) not null ,
    "user_name" VARCHAR(20),
    "created_at" DATETIME(0),
    "updated_at" TIMESTAMP(0) DEFAULT sysdate,
    primary key("id")
)';
$result = $pdo->exec($sql);

说明:
在表中创建一个自增列。
语法格式:

IDENTITY [ (种子, 增量) ]

插入数据

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

查询数据

$sql = "select * from test.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)) {
        $row = array_change_key_case($row,CASE_LOWER);  //将数组的key转为小写
        var_dump($row);
    }
}

更新数据

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

删除数据

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

配置PHP(面向对象接口)

以7.2为例

在达梦的安装包目录下找到php72_dm.dll(注意查看phpinfo,如果Thread Safetenabled,则选择该文件,否则选择php72nts_dm.dll

将该文件拷贝至php的扩展模板下(扩展目录通过查看phpinfo里面的extension_dir值)

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

extension=php72_dm.dll

重启服务器,然后查看phpinfo

如出现以上内容,则说明配置成功。

连接数据库

$link = dm_connect("localhost", "SYSDBA", "SYSDBA");
if(!$link){
    echo dm_error().':'.dm_errormsg();exit();
}
dm_setoption($link,1,12345,1);  //设置 dm 连接和语句的相关属性,设置UTF8

创建表

$sql = 'create table "test"."users1"
(
    "id" INTEGER identity(1, 1) not null,
    "user_name" VARCHAR(20),
    "created_at" DATETIME(0),
    "updated_at" TIMESTAMP(0) DEFAULT sysdate,
    primary key("id")
)';
$result = dm_exec($link,$sql);

插入数据

$sql = "insert into test.users1 (user_name,created_at,updated_at) values ('张三','2020-07-17 10:06:00','".date('Y-m-d H:i:s')."')";
$result = dm_exec($link,$sql);

查询数据

$sql = "select * from test.users limit 10";
$result = dm_exec($link,$sql);

print " 查询结果:</br><pre>";
while ($line = dm_fetch_array($result)){
    print_r($line);
    echo '<br>';
}

更新数据

$sql = "update test.users set user_name = '李四' where id = 1";
$result = dm_exec($link,$sql);

删除数据

$sql = "delete from test.users where id = 1";
$result = dm_exec($link,$sql);

设置默认模式

通常情况下,在sql语句中的表名前需要指定模式名。例如上面例子中的test.users,其中test就是模式名,users是表名。
可以通过SET SCHEMA设置当前模式。设置后,执行sql语句时,就可以省略模式名。

语法格式:

SET SCHEMA <模式名>;

其他

  • 查看数据库库名
select name,create_time from v$database;
  • 查看数据库实例名及状态
select name,instance_name,start_time,status$ from v$instance;
  • 查看数据库里所有使用用户
select username,user_id,default_tablespace,profile from dba_users;
  • 查看所有角色
select role from dba_roles;
  • 查看当前时间
SELECT CURRENT_TIMESTAMP();
  • 查看数据库版本
SELECT * FROM V$VERSION;
  • PDO下中文乱码
    打开C:\windows\System32\dm_svc.conf文件,新增一行:
CHAR_CODE=(PG_UTF8)

保存后重启apache

  • 获得系统建库时指定字符集
SELECT SF_GET_UNICODE_FLAG ();

0 表示 GB18030,1 表示 UTF-8,2 表示 EUC-KR

  • 查看是否开启归档模式
select name,arch_mode from v$database;
  • 查看库中所有表
SELECT * FROM ALL_TABLES;
  • 当前用户拥有的所有的表
select table_name from user_tables
  • 查看数据表定义
SELECT TABLEDEF('SYSDBA','MY_TABLE');  --入参:模式名,表名
  • 查看字段注释
select * from user_col_comments where Table_Name='xxx'
  • 获取最后插入的自增ID
SELECT @@IDENTITY as insert_id
  • group by时,查询的字段必须出现group by 后面
    MySQL可以通过any_value来添加没有出现在group by后面的字段,但是达梦不支持,可以把any_value改成min

  • 插入单引号
    单引号是特殊字符,达梦使用单引号作为转义字符,就像反斜杠。也就是说要插入单引号,那么需要两个单引号。

发表评论

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