3

我们有一个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)

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

4

2 回答 2

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');
于 2012-08-14T14:33:33.573 回答
0

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

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

但我认为更安全的方法可能是创建一个具有正确编码的新列,通过MySQL 的 convert() 函数对其进行更新,然后修复密钥。(创建一个新列,在 {id, new_column} 上创建一个唯一约束——这是对现有约束的补充——更新新列等)

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

我不确定 latin2 是否正确;MySQL 文档将其描述为“ISO 8859-2 中欧”。

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

于 2012-08-14T14:01:18.240 回答