3

site_tagsとの 2 つのフィールドで構成される主キーで呼び出されるテーブルがidありtagます。

一部のtagフィールドは、ISO-8859-1 に変換したい UTF-8 です。

このテーブルには 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) です。

これを達成する方法について何かアドバイスはありますか?

4

2 に答える 2

0

これは、PHPが連結された文字列をMySqlに渡す方法である必要があります。デバッグするには、mysqli.query(またはその他)の代わりにechoを使用し、ヘッダーと接続で同じ文字セットを使用していることを確認してください(少なくともデバッグの目的で)

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 Central European」と説明されています。

それでも重複キー エラーが発生する場合は、UTF8 の 2 つの異なる値が ISO-8859-1 の 1 つの値にマップされていることがわかると思います。

于 2012-08-14T14:01:18.240 に答える