【问题标题】:Mysql Duplicate Entry Before Apostrophe撇号前的Mysql重复条目
【发布时间】:2013-03-16 13:30:43
【问题描述】:

我正在尝试使用 activerecord 使用 codeigniter 导入一些数据。我收到了这个对我没有任何意义的错误

<p>Error Number: 1062</p>
<p>Duplicate entry 'L'' for key 'brand'</p>
<p>INSERT INTO `brands` (`brand`) VALUES ('L\'awlek')</p>

我对brands 表有一个UNIQUE 约束,因为我不想重复。我的问题是,为什么它会在第一个撇号处切断价值并声称这是关键?

相关代码:

define('TABLE','brands');

function add( $data ){
    $exists = $this->exists( $data['brand'] );
    if( ! $exists )
        $query = $this->db->insert( TABLE , $data);

    return ! $exists ? $this->db->insert_id() : $exists;
}

function exists( $value ){

    $query = $this->db->get_where( TABLE , array('brand'=>$value));

    if( $query && $query->num_rows() > 0 ){
        return $query->row()->id;
    } else {
        return false;
    }
}

【问题讨论】:

  • 列定义为 varchar(2) 还是类似的?
  • “品牌”列设置为 varchar(150)
  • 密钥brand是否定义为长度为2?
  • 如何查看密钥长度?我使用 SQLYog 创建表并为其分配了唯一索引
  • brands 表中品牌的 key_len 为 752

标签: php mysql codeigniter activerecord


【解决方案1】:

我认为您将数组 $data 传递给函数 add

add 中,您将$data 数组传递给函数exists

exists 中,您将数组视为变量,这意味着 你的 SQL 语句不是你所期望的。结果,你 没有找到您预先存在的记录,因此您的关键信息重复。

一个简单的修复可能是这样的:

function exists( $data ){

    $query = $this->db->get_where( TABLE , $data);

    if( $query && $query->num_rows() > 0 ){
        return $query->row()->id;
    } else {
        return false;
    }
}

更多细节
在下面的语句中,如果$value 是一个数组。

$query = $this->db->get_where( TABLE , array('brand'=>$value));

将评估为:

$query = $this->db->get_where( TABLE , array('brand'=>'Array'));

这就是您的查询返回 false 的原因,因为 'Array' 不是您表中的品牌。

PS
根据导致调用函数的事件顺序,可能还会发生其他事情,但在寻找其他更微妙的问题之前,应该修复这个明显的错误。

【讨论】:

  • 好收获!但是,我已经将 add 函数中的存在检查更改为使用 $data['brand'] 但它仍然会引发相同的错误。
  • 只是为了确保,作为一个测试,你试图插入一个已经存在的记录是数据库。您是否独立于add 函数测试了exists 函数?
  • 顺便问一下,$query-&gt;row()-&gt;id 的值是什么样的?
  • 它适用于直接插入表格的 L'awlek。但是在插入 L\'awlek 的情况下,当 L'awlek 或 L\'awlek 作为参数传入时,exists 返回 false。
  • $query->row()->id 值是整数,它在打破这一记录之前会通过数千条记录,并且其中一些非问题记录具有 '。
【解决方案2】:

感谢您的帮助!

一位开发人员针对数据集运行了这个 perl 脚本。我假设撇号是一个“聪明的报价”。该脚本删除了所有非 ascii 字符,并在之后工作。也许它会帮助其他人。

perl -i.bak -pe 's/[^[:ascii:]]//g' data.sql

【讨论】:

  • 这样就行了,非标准字符...问题解决了!
猜你喜欢
  • 2014-09-11
  • 2019-10-09
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多