2

(私は誤って最初にDBAでこの質問をしましたが、FAQで、代わりにここでSQLの質問をすることがわかりました)

エンコーディングが壊れたSQLテキストファイルからインポートされたMySQLデータベース(UTF-8照合)を「修復」しようとしています。

つまり、ドイツのウムラウトはデータベース内で壊れています。たとえば「ü」は「ü」と表示されます。

私はREPLACE関数を知っているので、最初に明白なことを試みました:

SELECT * FROM `mydb`.`mytable` WHERE `mycolumn` LIKE '%ü%';

これは私に期待された結果を与えました。

次に、それらを置き換えようとしました:

UPDATE `mydb`.`mytable` SET `mycolumn` = REPLACE(`mycolumn`, 'ü', 'ü');

驚いたことに、これにより影響を受ける行はゼロになりました。

したがって、エンコーディングについて多くのことを知っていても、これを解決する方法(またはそれが可能かどうか)を理解することはできません。

私の質問:

この関数を使用して、REPLACE壊れたドイツのウムラウトを置き換える方法は?

4

3 に答える 3

3

私自身の質問に答えるために、リンクされた可能性のある複製は私をある方向に向けましたが、私にとって正しい解決策ではありませんでした。

代わりに、(HeidiSQLを使用して)次の手順を実行しました。

  1. ツリーのテーブルを右クリックしました。
  2. 選択した「編集」
  3. 「デフォルトの照合」のドロップダウン値を「latin_german1_ci」に変更しました。「データの変換」チェックボックスにチェックを入れませんでした。
  4. 下部にある[保存]ボタンをクリックしました。
  5. 「デフォルトの照合」のドロップダウン値を「utf8_general_ci」に変更しました。「データの変換」チェックボックスにチェックを入れませんでした。
  6. 下部にある[保存]ボタンをクリックしました。

その後、次のようなステートメントを正常に実行できました。

UPDATE `mydb`.`mytable` SET `mycolumn` = REPLACE(`mycolumn`, 'ü', 'ü');
于 2013-02-25T17:11:04.390 に答える
2

あなたの「ウムラウト」は壊れていません!これらはutf-8としてエンコードされているだけなので、「u with two dot」は、utf-82バイトシーケンスになります。それについては何も悪いことはありません。問題は、ビューアがANSIエンコーディング(iso-8859-1)で表示される可能性があり、その結果、バイトと文字が1:1の関係になることです。ただし、ビューアはutf-8シーケンスを「デコード」して文字のコードポイントを取得する必要があります。そうしないと、ANSIで表す文字としてutf-8の開始バイトと後続バイトが表示されます。あなたのビューはutf-8でエンコードされたテキストを表示するように構成されていないに違いありません。必要に応じて設定するだけで完了です。

'u with two dot'をutf-8でエンコードすると、世界中のすべてのビューアが、一意のUnicodeコードポイントであるコードポイントをデコードできます。'u with two dot'がANSIエンコードされている場合、異なるANSIエンコード(iso-8859-5など)で表示されると、異なる文字が表示される可能性があることに注意してください。

于 2013-11-29T13:09:50.207 に答える
1

IMHO、MySQLは、UTF-8照合以上üを使用して保存するのが正しいです。(なぜ好むのかについての議論üutf8_general_ciutf_unicode_ciutf8_unicode_ci

ここで、HTML、Android、iOSなどのフロントエンドに出力する前に、UTFでエンコードされたSQL文字列をどのようにデコードするかが重要になります。

HTML

<head>HTMLの場合、 HTMLページのセクションにutf-8文字セットを設定すると、ドイツ語の文字üが正しく表示されます。

<head>
    <meta charset="UTF-8"/>
    ...
</head>

そうでない場合、PHPの場合は、変数をutf_decode()関数でラップしてから出力します。

注:MySQLでPHPを使用していない場合は、選択した言語でutf-8デコード関数を検索してください。

アンドロイド

Androidを使用する場合

Html.fromHtml(String).toString();

iOS

iOSを使用する場合

(NSString *)stringByDecodingHTMLEntities;
于 2018-04-05T08:19:49.490 に答える