【问题标题】:Query with special characters doesn't work in Active Record带有特殊字符的查询在 Active Record 中不起作用
【发布时间】:2015-12-16 14:26:38
【问题描述】:

我有一个这样的简单函数:

function get($name) {

  //SELECT ID FROM USERS WHERE NAME = $name
  $this->db->select('ID');
  $this->db->limit(1);
  $this->db->from('USERS');
  $this->db->where('NAME', $name);

  $query = $this->db->get();

  $row = $query->row();
  return $row->ID;  
}

除了$name 中有特殊字符(例如Ñ 或 Á)外,一切正常。在这种情况下,查询不会返回任何行。

我使用$this->db->last_query() 直接在 SQL 控制台上尝试查询,并返回一个完全有效的查询,该查询返回预期值。对我来说,这意味着查询没问题,但是 Codeigniter 和 SQL Server 之间存在一些编码问题。

我已经检查了 DB 编码配置及其:

$db['odbc']['char_set'] = 'utf8';
$db['odbc']['dbcollat'] = 'utf8_general_ci';

DB 的排序规则是Modern_Spanish_CI_AS,NAME 字段设置在databse default

我错过了什么?可能是PHP配置有问题?

【问题讨论】:

  • 你需要用like代替where $this->db->like('NAME', $name);
  • 你的数据库的排序规则是什么??
  • 使用 mysql_real_escape_string()
  • 你的数据库和表USERS&NAME字段的排序规则是什么??
  • @devpro 我刚试过,结果一样。

标签: php sql-server codeigniter activerecord character-encoding


【解决方案1】:

将数据库排序规则更改为utf8_general_ci

并检查USERS 表排序规则和NAME 字段排序规则。

 ALTER DATABASE <database_name> COLLATE SQL_Latin1_General_CP1_CI_AS ;

 ALTER TABLE USERS ALTER COLUMN NAME varchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS

您也可以从管理工作室进行更改。它在选项菜单下

【讨论】:

  • 找不到该排序规则。它从 Urdu_100 直接转到 Uzbek_latin。
  • 我正在使用 SQL Server。您可以在问题或标签中看到它。
  • 对不起.. 我也会给你这些问题
  • 我已经尝试了这些查询,但它们不起作用。我收到很多“不正确的 Sintax”错误。可能他们是为 MySQL 准备的,
【解决方案2】:

试试

$this->db->like('NAME', $name);

在头文件中

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

如果您使用 Codeigniter form_open(),它会自动生成 &lt;form method="post" accept-charset="utf-8" 这部分。

【讨论】:

  • 对不起,我已经尝试过“喜欢”的方法。您可以在第一条评论中看到它。并且该文件已经具有该标题。还是谢谢
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2012-03-23
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多