Avant-propos
L'entreprise souhaite s'engager dans un développement localisé et la base de données utilise la base de données Dameng La version Dameng est dm8 et la version php est 7.2. Le développement initial a été réalisé sur Windows.
La base de données est migrée de MySQL vers la base de données Dameng. Je n'entrerai pas dans la méthode de migration et la méthode d'installation de l'extension PHP. Il existe de nombreuses informations sur Internet à ce sujet.
Cependant, il existe relativement peu d'informations sur la façon d'utiliser PHP pour se connecter à la base de données Dameng.Tout le monde connaît la technologie du service client.Toutes les informations dépendent de la lecture des documents.Je vais vous présenter brièvement les pièges sur lesquels j'ai marché. La méthode consiste à exploiter directement la base de données, vous pouvez ensuite la conditionner selon vos propres préférences.
Une brève explication du répertoire d'informations de Dameng. Le "doc" sous le répertoire d'installation de Dameng contient principalement divers documents d'utilisation. Les "drivers" contiennent des extensions pour différentes langues PHP, donc l'extension est tirée d'ici, J'utilise principalement l'extension de. php_dm ici. Il y a trop peu d'informations sur pdo_dm, donc je n'ai pas fait beaucoup de recherches.
Il y a deux points qui doivent être rappelés lors de l'instanciation de la base de données Le jeu de caractères et la sensibilité à la casse des chaînes doivent être définis à l'avance, et ne creusez pas de trous par vous-même.
Mon expérience est que les noms de tables de données et les noms de champs migrés depuis MySQL sont tous en minuscules, ce qui entraîne divers pièges lorsqu'ils sont utilisés ultérieurement. Plus tard, j'ai découvert que la sensibilité à la casse pouvait être supprimée.
Ici, nous utiliserons la table CITY dans la bibliothèque d'exemples officielle pour démontrer diverses méthodes d'utilisation de php7.2.
Query
Sans plus tarder, commençons par le code
//连接数据库 $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);
Les méthodes d'utilisation de l'extension php officielle de Dameng, php5 et php7, sont très différentes. De nombreuses méthodes en php5 ne peuvent pas être utilisées en php7. , certaines méthodes sont remplacées par d'autres méthodes dans php7. La plupart des informations sur Internet concernent php5, ce qui est totalement inutilisable en php7.
Le problème des caractères chinois tronqués dans les instructions de requête est un gouffre. J'ai essayé cette méthode après avoir longuement vérifié la documentation. S'il existe d'autres méthodes plus élégantes, apprenez-moi, et tout le monde pourra apprendre les uns des autres.
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);
La fonction dm_insert_id() officiellement fournie semble être uniquement disponible en php5. PHP7 n'a pas cette fonction Vous ne pouvez interroger la valeur d'identifiant auto-incrémentée que via la courbe. dans la démonstration n'a pas d'ID auto-incrémenté, et en même temps, SELECT @@IDENTITY as insert_id est certain d'interroger avec succès Même si l'insertion échoue, l'ID d'auto-incrémentation de l'insertion réussie précédente sera renvoyé. N'utilisez jamais l'ID d'incrémentation automatique pour déterminer si l'instruction est insérée avec succès .
Mise à jour
//连接数据库 $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);
La mise à jour est très simple
Supprimer
//连接数据库 $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);
La suppression est également très simple, il n'y a rien de spécial à surveiller
Transaction
Selon la documentation officielle : "DM ne fournit pas de définition explicite du début d'une instruction de transaction, la première instruction SQL exécutable (sauf les instructions de connexion) implique le début d'une transaction. " C'est la raison pour laquelle il n'y a pas de méthode de démarrage de transaction définie, mais lorsque l'on veut démarrer une transaction à partir de un certain programme, nous pouvons utiliser la fonction dm_autocommit() pour désactiver la soumission automatique de la transaction et activer la soumission automatique après la fin du programme
//连接数据库 $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);
La fosse sur laquelle on a marché
1 Obtenez l'heure dans le. format d'horodatage dans la base de données Damengsélectionnez DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE());
select DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE());
二、如果之前使用的数据库是mysql,时间格式 DATETIME 和 TIMESTAMP 这两种类型后面的标度要注意一下,如果不是0的话时间精度会更长
三、有些字段查询出来的话会变成大写,比如“count”
解决方法:将字段用双引号引上例:select count(1) as "count" from "DMHR"."CITY";
sélectionnez count(1) comme "count" dans "DM HR "."CITY" ;
🎜四、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);
结语
目前踩过的坑就这些了,希望能够帮助到大家。
对于其他问题还是要多翻阅官方文档了。