我正在使用codeigniter / SQL。我想在哪里插入带有'N'的unicode字符串前缀插入。如何在常规插入中实现它。
常规代码:
$data = array(
'title' => 'My title' ,
'name' => 'My Name' ,
'data' => 'My data'
);
$this->db->insert('mytable', $data);
INSERT尝试实现:
INSERT INTO mytable (title, name, data)
VALUES ('My title','My Name',N'My data');
有没有办法获得上面的插入而不是手动编写查询。?
答案 0 :(得分:1)
这是最简单的方法。
$data = array(
'title' => 'My title' ,
'name' => 'My Name' ,
'data' => 'N'.'My data'
);
$this->db->insert('mytable', $data);
或者,如果前缀需要更加动态,请执行此操作
$pre = foo(bar);
$data = array(
'title' => 'My title' ,
'name' => 'My Name' ,
'data' => $pre.'My data'
);
$this->db->insert('mytable', $data);
答案 1 :(得分:1)
我使用Codeignter 3,驱动程序sqlsrv遇到了Unicode问题,我设法让它修改了System / database / DB_Driver.php。可能有一个更好的解决方案,它不漂亮,但它正在工作,只需修改函数_insert和_update。
protected function _insert($table, $keys, $values)
{
foreach($values as $key => $value)
{
if(substr($value,0,1) == "'")
{
$values[$key] = "N". $value;
}
}
return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')';
}
protected function _update($table, $values)
{
foreach($values as $key => $value)
{
if(substr($value,0,1) == "'")
{
$values[$key] = "N". $value;
}
}
foreach ($values as $key => $val)
{
$valstr[] = $key.' = '.$val;
}
return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
.$this->_compile_wh('qb_where')
.$this->_compile_order_by()
.($this->qb_limit ? ' LIMIT '.$this->qb_limit : '');
}
答案 2 :(得分:1)
感谢 Eggy 和 Leandro 的建议。我使用 CI 3.1.9,这是我的解决方案:
public function escape($str)
{
...
elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))
{
if ($this->dbdriver == 'sqlsrv')
{
return "N'".$this->escape_str($str)."'";
}
return "'".$this->escape_str($str)."'";
}
...
}