我们有一个名为site_tags
的表,主键由2个字段组成 - id
和tag
。
某些tag
字段采用UTF-8格式,我们希望将其转换为ISO-8859-1。
在此表中有2个标记Seany
和seá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)
关于如何实现这一目标的任何建议?
答案 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');