thinkphp6 + oracle 数据库连接 表名、字段名大小写和字符集

之前一直用tp6连接的都是mysql数据,近期一个项目需要连接oracle数据,理论上thinkphp是支持oracle数据库的,但是由于oracle的数据库编码方式和字段表名大小写与mysql不一样。首先oracle的表名默认是全大写的,可是如果使用tp6连接的话会把大写字母一个个的用下划线分开,如USERS会被分成u_s_e_r_s,这就很扯淡了,解决这个有两种方法,一种是禁用think框架里大写分隔过滤功能,但是如果改了这个每次系统升级后就会失效,还有一种就是直接在model里指定表名,虽然麻烦了点,但是不影响以后框架升级,具体方法如下

php 复制代码
<?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,

],

php 复制代码
// 数据库连接配置信息
    '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,
        ],

        // 更多的数据库配置信息
    ],
相关推荐
web安全工具库18 小时前
Linux进程的:深入理解子进程回收与僵尸进程
java·linux·数据库
麦聪聊数据18 小时前
大数据与云原生数据库中的 SQL2API:优化跨平台数据访问与查询
数据库·sql·云原生
michaelzhouh18 小时前
php项目ueditor上传pdf文件,防止XSS攻击
pdf·php·xss·ueditor
虚伪的空想家18 小时前
记录次etcd故障,fatal error: bus error
服务器·数据库·k8s·etcd
笨手笨脚の18 小时前
Mysql 的锁机制
数据库·mysql··死锁·间隙锁
老友@18 小时前
一次由 PageHelper 分页污染引发的 Bug 排查实录
java·数据库·bug·mybatis·pagehelper·分页污染
hzk的学习笔记19 小时前
Redisson解锁失败,watchdog会不会一直续期下去?
数据库·redis·缓存
合作小小程序员小小店19 小时前
web网页开发,在线%商城,电商,商品购买%系统demo,基于vscode,apache,html,css,jquery,php,mysql数据库
开发语言·前端·数据库·mysql·html·php·电商
TDengine (老段)19 小时前
TDengine 字符串函数 CONCAT 用户手册
java·数据库·tdengine
一 乐19 小时前
旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
开发语言·前端·数据库·vue.js·spring boot·后端·旅游