之前一直用tp6连接的都是mysql数据,近期一个项目需要连接oracle数据,理论上thinkphp是支持oracle数据库的,但是由于oracle的数据库编码方式和字段表名大小写与mysql不一样。首先oracle的表名默认是全大写的,可是如果使用tp6连接的话会把大写字母一个个的用下划线分开,如USERS会被分成u_s_e_r_s,这就很扯淡了,解决这个有两种方法,一种是禁用think框架里大写分隔过滤功能,但是如果改了这个每次系统升级后就会失效,还有一种就是直接在model里指定表名,虽然麻烦了点,但是不影响以后框架升级,具体方法如下
<?php
namespace app\model;
use think\Model;
/**
* @mixin \think\Model
*/
class Users extends Model
{
//这里直接添加表名,调用的时候直接用模型就行
protected $table = 'USERS';
}
这个问题解决了,但是使用模型查询时一旦有字符串查询就会因为模型返回中会调用核心框架的json函数导致一直报错
“model Malformed UTF-8 characters, possibly incorrectly encoded”
经查询资料,使用php连接字符串时是可以指定字符集的,不影响原数据库的字符集,但是thinkphp官方没有完整的oracle连接示例,写的不对,一直报错,最后在研究了自带的连接文件后总算弄了个易懂规范的格式,分享出来,也纪录一下,省得自己忘了。
还有就是如果加上参数可以将oracle表中默认字段大写改成全部小写,这样也就保持命名规范了,要不然看着怪怪的。
// 数据库连接参数字段名大小写
'params' => [
\PDO::ATTR_CASE => \PDO::CASE_LOWER,
],
// 数据库连接配置信息
'connections' => [
'oracle' => [
// 数据库类型
'type' => env('database.type', 'oracle'),
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
//端口号
'hostport' => env('database.hostport', '1521'),
// 数据库实例名
'database' => env('database.database', 'orcl'),
//编码类别
'charset' => env('database.charset', 'AL32UTF8'),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', ''),
// 数据库连接参数
'params' => [
\PDO::ATTR_CASE => \PDO::CASE_LOWER,
],
// 数据库表前缀
'prefix' => env('database.prefix', ''),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => env('app_debug', true),
// 开启字段缓存
'fields_cache' => false,
],
// 更多的数据库配置信息
],