머리말
회사에서는 Dameng 데이터베이스를 사용하고 있습니다. Dameng 버전은 dm8이고 php 버전은 Windows에서 진행되었습니다.
데이터베이스는 mysql에서 Dameng 데이터베이스로 마이그레이션됩니다. 이와 관련된 마이그레이션 방법과 PHP 확장 설치 방법에 대해서는 다루지 않겠습니다.
그러나 PHP를 사용하여 Dameng 데이터베이스에 연결하는 방법에 대한 정보는 모두가 알고 있습니다. 모든 정보는 문서를 읽는 데 달려 있습니다. 방법은 데이터베이스를 직접 운영하는 것이며 자신의 취향에 따라 패키지할 수 있습니다.
Dameng의 정보 디렉토리에 대한 간략한 설명입니다. Dameng의 설치 디렉토리에 있는 "doc"에는 다양한 언어에 대한 확장 기능이 포함되어 있습니다. 예, 저는 주로 다음의 확장 기능을 사용합니다. php_dm은 여기에. pdo_dm에 대한 정보가 너무 적어서 많이 조사하지 않았습니다.
데이터베이스를 인스턴스화할 때 기억해야 할 두 가지 사항이 있습니다. 문자 집합과 문자열 대/소문자 구분을 미리 설정해야 합니다. 스스로 구멍을 파지 마세요.
내 경험에 따르면 MySQL에서 마이그레이션된 데이터 테이블 이름과 필드 이름은 모두 소문자이므로 나중에 사용할 때 여러 가지 함정이 발생합니다. 대소문자 구분을 제거할 수 있다는 것을 알게 되었습니다.
여기에서는 공식 샘플 라이브러리의 CITY 테이블을 사용하여 php7.2의 다양한 사용 방법을 보여드리겠습니다.
Query
더 이상 고민하지 말고 코드부터 시작하겠습니다
//连接数据库 $link = dm_connect("localhost", "SYSDBA", "SYSDBA"); if(!$link){ var_dump(@dm_error()); var_dump(iconv("GBK","UTF-8",@dm_errormsg())); } dm_setoption($link,1,12345,1);//设置 dm 连接和语句的相关属性,设置UTF8 $query = "select * from DMHR.CITY"; $result = dm_exec($link,$query); print " 查询结果:"; while ($line = dm_fetch_array($result)){ print_r($line); echo '<br>'; } /* 释放资源 */ dm_free_result($result); /* 断开连接 */ dm_close($link);
Dameng의 공식 PHP 확장 프로그램인 php5와 php7의 사용 방법은 매우 다릅니다. php7에서는 사용할 수 없습니다. , 일부 메소드는 php7에서 다른 메소드로 대체됩니다. 인터넷에 있는 대부분의 정보는 php5에 대한 것이므로 php7에서는 완전히 사용할 수 없습니다.
쿼리문의 한자가 왜곡되는 문제는 싱크홀입니다. 오랫동안 문서를 확인한 후 이 방법을 시도했습니다. 다른 더 우아한 방법이 있으면 가르쳐 주세요. 모두가 서로 배울 수 있습니다. Insert//连接数据库 $link = dm_connect("localhost", "SYSDBA", "SYSDBA"); if(!$link){ var_dump(@dm_error()); var_dump(iconv("GBK","UTF-8",@dm_errormsg())); } dm_setoption($link,1,12345,1);//设置 dm 连接和语句的相关属性,设置UTF8 $query = "INSERT INTO DMHR.CITY (CITY_ID,CITY_NAME,REGION_ID) VALUES ('JL','吉林','1')"; $result = dm_exec($link,$query); if($result){ echo "插入成功"; //曲线查询插入id /*$query = "SELECT @@IDENTITY as insert_id"; $result = dm_exec($link,$query); $line = dm_fetch_array($result); echo ',ID:'; print_r($line);*/ } /* 释放资源 */ dm_free_result($result); /* 断开连接 */ dm_close($link);
공식적으로 제공되는 dm_insert_id() 함수는 php5에서만 사용할 수 있는 것 같습니다. PHP7에는 이 함수가 없습니다 물론, 테이블을 통해서만 자동 증가된 id 값을 쿼리할 수 있습니다. 데모에서는 자동 증가 ID가 없으며, 동시에 insert_id로 SELECT @@IDENTITY를 사용하면 삽입에 실패하더라도 이전에 성공한 삽입의 자동 증가 ID가 반환됩니다. 문이 성공적으로 삽입되었는지 확인하기 위해 자동 증가 ID를 사용하지 마세요. Update
//连接数据库
$link = dm_connect("localhost", "SYSDBA", "SYSDBA");
if(!$link){
var_dump(@dm_error());
var_dump(iconv("GBK","UTF-8",@dm_errormsg()));
}
dm_setoption($link,1,12345,1);//设置 dm 连接和语句的相关属性,设置UTF8
$query = "UPDATE DMHR.CITY SET REGION_ID='2' WHERE CITY_ID='JL'";
$result = dm_exec($link,$query);
if($result){
echo "更新成功";
}
/* 释放资源 */
dm_free_result($result);
/* 断开连接 */
dm_close($link);
Update는 매우 간단합니다Delete
//连接数据库
$link = dm_connect("localhost", "SYSDBA", "SYSDBA");
if(!$link){
var_dump(@dm_error());
var_dump(iconv("GBK","UTF-8",@dm_errormsg()));
}
dm_setoption($link,1,12345,1);//设置 dm 连接和语句的相关属性,设置UTF8
$query = "DELETE FROM DMHR.CITY WHERE (CITY_ID='JL')";
$result = dm_exec($link,$query);
if($result){
echo "删除成功";
}
/* 释放资源 */
dm_free_result($result);
/* 断开连接 */
dm_close($link);
삭제도 매우 간단합니다. 특별히 주의할 점은 없습니다.Transaction
공식 문서에 따르면 "DM은 트랜잭션 문 시작을 명시적으로 정의하면 첫 번째 실행 가능한 SQL 문(로그인 문 제외)이 트랜잭션의 시작을 의미합니다." 이것이 정의된 트랜잭션 시작 방법이 없는 이유입니다. 특정 프로그램에서는 dm_autocommit( ) 함수를 사용하여 트랜잭션 자동 제출을 끄고 프로그램 종료 후 자동 제출을 켤 수 있습니다//连接数据库 $link = dm_connect("localhost", "SYSDBA", "SYSDBA"); if(!$link){ var_dump(@dm_error()); var_dump(iconv("GBK","UTF-8",@dm_errormsg())); } dm_setoption($link,1,12345,1);//设置 dm 连接和语句的相关属性,设置UTF8 $query = "INSERT INTO DMHR.CITY (CITY_ID,CITY_NAME,REGION_ID) VALUES ('JL','吉林','1')"; $result = dm_exec($link,$query); if($result){ echo "插入成功。"; } $result = dm_autocommit($link,false);//事务自动提交关闭 $query = "UPDATE DMHR.CITY SET CITY_NAME='辽宁' WHERE (CITY_ID='SY')"; $result = dm_exec($link,$query); if($result){ echo "更新成功,回滚。"; } dm_rollback($link);//回滚 //dm_commit($link);//提交 $result = dm_autocommit($link,true);//开启事务自动提交,结束事务 /* 断开连接 */ dm_close($link);
밟힌 구덩이
1. Dameng 데이터베이스의 타임스탬프 형식select DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE());
2. 이전에 사용한 데이터베이스가 mysql인 경우 지불합니다. DATETIME 및 TIMESTAMP의 두 가지 유형의 시간 형식 뒤에 있는 규모에 주의하세요. 0이 아닌 경우 시간 정확도가 더 길어집니다select DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE());
二、如果之前使用的数据库是mysql,时间格式 DATETIME 和 TIMESTAMP 这两种类型后面的标度要注意一下,如果不是0的话时间精度会更长
三、有些字段查询出来的话会变成大写,比如“count”
解决方法:将字段用双引号引上例:select count(1) as "count" from "DMHR"."CITY";
"DM HR "."CITY"에서 "count"로 count(1)를 선택합니다;
🎜四、group by语句的使用很严格(或者说mysql的group by过于放松),select中除聚合函数之外出现的所有字段必须要在group by里面。
比方举一个错误的例子:
select EMPLOYEE_NAME,JOB_ID from "DMHR"."EMPLOYEE" group by JOB_ID;
EMPLOYEE_NAME和字段没在group by 中,执行必定失败
提供一种解决思路:
select * from "DMHR"."EMPLOYEE" where EMPLOYEE_ID in (select min(EMPLOYEE_ID) as minid from "DMHR"."EMPLOYEE" group by JOB_ID)
同样select中如果有聚合函数之外的字段,需要加入group by。错误的例子:
select min(EMPLOYEE_ID),EMPLOYEE_NAME,JOB_ID from "DMHR"."EMPLOYEE";
select中有min()函数外还有其他字段,执行必定失败。
如果一定要在其他很多字段里面加入聚合函数,提供一种思路:
select t1.EMPLOYEE_NAME,t1.JOB_ID,t2.minid from "DMHR"."EMPLOYEE" t1 left join ( select min(EMPLOYEE_ID) as minid,JOB_ID from "DMHR"."EMPLOYEE" group by JOB_ID ) t2 on t2.JOB_ID=t1.JOB_ID where t1.EMPLOYEE_ID in (select min(EMPLOYEE_ID) as minid from "DMHR"."EMPLOYEE" group by JOB_ID);
结语
目前踩过的坑就这些了,希望能够帮助到大家。
对于其他问题还是要多翻阅官方文档了。