You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移MySQL到SQL Server时,如何移除CodeIgniter表名外的圆括号?

解决CodeIgniter生成带圆括号表名的SQL Server兼容问题

Hey,我正好处理过类似的CodeIgniter迁移到SQL Server的场景,太懂你这个括号问题的糟心了!咱们直接来看怎么解决:

问题出在哪?

你已经尝试关闭了标识符保护,还给from()传了false参数,但CodeIgniter的查询构建器在处理SQL Server驱动时,还是会自动给表名套上括号——这是框架针对某些场景的默认处理,但恰好SQL Server不买账。

方案1:直接写原生SQL(最省心)

如果你的查询逻辑不复杂,直接用原生SQL是最稳妥的,完全绕开构建器的自动处理:

// 用参数绑定保证安全性,同时完全控制SQL结构
$sql = "SELECT * FROM tb_card WHERE company_id = ?";
$result = $this->db->query($sql, [$this->company_id])->row_array();

这样生成的SQL绝对不会有多余的括号,完美适配SQL Server。

方案2:调整查询构建器写法

要是你更习惯用构建器,试试这么修改代码:

// 关闭字段的标识符保护
$this->db->select('*', false);
// 这里不要给from()传第二个false参数,让驱动正常处理表名
$this->db->from('tb_card');
$this->db->where('company_id', $this->company_id, FALSE);
$result = $this->db->get()->row_array();

另外,你还可以在数据库配置文件(application/config/database.php)里全局关闭标识符保护,省得每个查询都要设置:

// 找到SQL Server对应的配置项,添加或修改这一行
$db['default']['protect_identifiers'] = FALSE;

验证结果

改完之后,用last_query()看看生成的SQL是不是符合预期:

echo $this->db->last_query();
// 正常输出应该是:SELECT * FROM tb_card WHERE company_id = 27

这样调整后,你的查询就能在SQL Server上正常跑起来啦!

内容的提问来源于stack exchange,提问作者Nikul Panchal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:11:15