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,
        ],

        // 更多的数据库配置信息
    ],
相关推荐
复园电子2 小时前
企业级PDF批量盖章方案选型指南
数据库·pdf
Lhappy嘻嘻7 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
AI-好学者9 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
2601_9637713710 小时前
How to Scale Your WordPress Store Traffic in 2026
前端·php·plugin
其实防守也摸鱼10 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚10 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔72510 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋11 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
Database_Cool_11 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾11 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#