UTF-8数据存在重复的主键问题

时间:2012-08-14 13:41:28

标签: php mysql character-encoding

我们有一个名为site_tags的表,主键由2个字段组成 - idtag

某些tag字段采用UTF-8格式,我们希望将其转换为ISO-8859-1。

在此表中有2个标记Seanyseány,我们希望将后者从UTF-8转换。

当我们尝试使用...

DELETE FROM site_tags WHERE id = '1325133476' AND tag = 'seány'

INSERT INTO site_tags (id, tag, active) VALUES ('1325133476', 'seány', '0')

MySQL在插入时给出了错误:

Duplicate entry '1325133476-seány' for key 'PRIMARY' 

这似乎是因为它找到了Seany标签,所以认为它是重复的,MySQL不是字符集敏感的(即使删除工作在正确的记录上)。

数据库使用latin1_swedish_ci排序规则,MySQL是v5.1(InnoDB)

关于如何实现这一目标的任何建议?

2 个答案:

答案 0 :(得分:0)

我希望UPDATE语句能够正常工作,但我可能会遗漏一些东西。 (我不必非常处理字符集。)如果需要,可以更改外键以级联更新。未经测试。 。

update site_tags 
set tag = 'seány'
where id = '1325133476' AND tag = 'seány';

但我认为更安全的方法可能是创建一个具有正确编码的新列,通过MySQL's convert() function更新它,然后修复密钥。 (创建一个新列,在{id,new_column}上创建一个唯一约束 - 除了现有约束之外 - 更新新列等。)

update site_tags
set new_column = convert(tag using latin2)
where new_column is null;

我不确定拉丁2是对的; MySQL docs将其描述为“ISO 8859-2中欧”。

如果仍然出现重复键错误,我希望发现UTF8中的两个不同值映射到ISO-8859-1中的单个值。

答案 1 :(得分:0)

它必须是PHP将连接字符串传递给MySql的方式。请调试,使用echo而不是mysqli.query(或其他),并确保(至少为了调试目的)你在标题和连接上使用相同的字符集

mysqli.query(SET CHARACTER SET latin1;);     // latin1 matches ISO-8859-1 on mysql connection
header('Content-Type: text/html; charset=iso-8859-1');