迁移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
相关产品推荐
相关产品推荐

