4

テキストの一部が奇妙に表示されており、一部の文字を置き換える必要があります。ただし、次の特定の文字に問題があります(文字間の違いを示すためのjavascriptコード):

<script>
alert('–'.charCodeAt(0) + ':' + '-'.charCodeAt(0));
</script>

MySQL では、次のクエリを適用しようとしました。

UPDATE translation SET columnx = REPLACE(columnx, '–', '-');

しかし、それは0行に影響します。したがって、問題は、これらの奇妙な文字を正しい文字に置き換える正しいクエリは何ですか?

アップデート

奇妙な文字は次のように表示されます (四角):

四角で表示される奇妙な文字

JSON では、\u0096代わりに としてエンコードされます。-

4

2 に答える 2

3

Alvaro が言ったように、データベースを正しい文字セットに変更するように努めるべきです。通常は utf-8 文字セットで十分です。

詳細については、http: //dev.mysql.com/doc/refman/5.0/en/charset-applications.htmlを参照してください。

そうする権利がない場合は、http: //dev.mysql.com/doc/refman/5.1/de/charset-convert.html および https://dba.stackexchange.com/questions/をご覧ください。 9944/mysql-transfer-iso-8859-1-to-utf-8

于 2012-12-19T12:22:36.570 に答える
2

これは文字セットではなく、照合関連のようです。照合順序は、ソートまたは比較に関して、MySQL が「ほぼ等しい」文字をどのように扱うかを定義します。

たとえば、iso-8859-15 のデフォルトの照合では、ü = u

できることは、フィールドをビン照合のように扱うことです。バイナリ照合では、類似の文字は同等に扱われません。

正しいバイナリ照合順序を選択してください

SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLLATIONS WHERE COLLATION_NAME LIKE '%bin%';

次に、次のように更新を実行します。

UPDATE TABLE SET columnx = REPLACE( columnx COLLATE latin1_bin, '–', '-' );

訂正: REPLACE 比較は常にバイナリ照合を使用して行われます

編集:

それでも 0 行が更新される場合は、正しい文字を置き換えていない可能性があります。文字を含む文字列を 16 進数に変換し、16 進数値を投稿して、どの文字について話しているかを確認できるようにします

例えば

SELECT HEX( columnx ) LIMIT 1;

EDIT2:

見たばかりですが、あなたは実際に、START OF GUARDED AREA\u0096と呼ばれる制御文字を取得すると言いました..この文字が作成するプログラムは何であれ..16 進数でこれは. クエリの例では、 EN DASHという文字を置き換えています0xC2 0x96

貼り付けるだけで制御文字を置き換えるのは難しく、変換によって制御文字が壊れる可能性があります。代わりにUNHEX( hexval )を使用して、MySQL に意味する文字を伝えることができます。

UPDATE TABLE SET columnx = REPLACE( columnx UNHEX( 'C296' ), '-' );

または、これをより明確にするために(またはさらに混乱させる:))、これは「通常の」ハイフンも16進値として渡します

UPDATE TABLE SET columnx = REPLACE( columnx UNHEX( 'C296' ), UNHEX( '2D' ) );
于 2012-12-19T13:07:08.940 に答える