1

私が最近取り組んでいるサイトでは、データベースに問題がありました。テーブルを復元したときに、奇妙な記号 (半角記号や度記号など) を含むテキスト フィールドが破損したようです。テキスト フィールドはその記号の前の文字で停止していました)。テーブルのコピーを取得し、それを以下のコードに要約しました。

    CREATE TABLE `products2` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `description` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id`)
    ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    insert  into products2 values  
(25, 0x5468652044504D203931322069732061206C617267652033BD204469676974204C434420566F6C746D657465722E20546865207369676E616C206265696E67206D6561737572656420697320616C736F207573656420746F20706F77657220746865206D657465722C20696E636C7564696E6720746865206261636B6C696768742E20546865206D657465722066656174757265732061203320746F20363056206D6561737572656D656E742072616E67652C20776974682061207265736F6C7574696F6E206F662031306D56206265747765656E20332E303020616E642031392E39395620616E64203130306D56206265747765656E2032302E3020616E642036302E30562E205768656E2074686520766F6C746167652064726F70732062656C6F772033562C204C4F20697320646973706C617965642028646F776E20746F20322E38562C207768656E2074686520646973706C61792077696C6C207475726E206F6666292E209148499220697320646973706C61796564207768656E2074686520766F6C7461676520676F65732061626F7665203630562E0D0A0D0A5363726577207465726D696E616C7320616C6C6F7720666F7220717569636B20616E64206561737920636F6E6E656374696F6E2E20546865206D6574657220697320686F7573656420696E206120726F6275737420636172726965722077686963682063616E20626520626F6C74656420696E20706C616365206F722070616E656C206D6F756E746564207573696E6720746865206C6F772070726F6669206C652062657A656C20616E6420636C6970732070726F76696465642E20416E2049503637202F204E454D412034582062657A656C20697320616C736F20617661696C61626C6520666F722070726F74656374696F6E20616761696E7374206475737420616E64206D6F6973747572652E0D0A0D0A417320746869732069732061206E65772064657369676E2077652073756767657374207468617420796F7520636F6E74616374204C617363617220666F7220757020746F2064617465206C6561642D74696D6520696E666F726D6174696F6E206265666F7265206F72646572696E67206F6E6C696E652E0D0A)

これはエラーをスローします:

#1366 - Incorrect string value: '\xBD Digi...' for column 'description' at row 1 

stackoverflow と Web でこの問題を調べると、エンコーディングの問題のようです。説明フィールドの照合を utf_unicode_ci に変更し、テーブルの照合を utf_bin (およびそれらのすべての組み合わせ) に変更してみました。役立たず。

バックアップなので、ダンプをやり直すことはできません。システムがダンプを出力する方法を理解していませんが、それを受け入れることはできません-おそらくバックアップはコマンドライン経由で行われ(確かではありません)、PHPMyAdminを使用して復元していますが、それが違いを生むかどうかはわかりません。

データをインポートできない場合は、エンコードされたデータをテキストに読み込んで手動でカット アンド ペーストする方法を教えていただければ幸いです。

4

1 に答える 1

5

最初の32バイトをASCIIとしてデコードすると、次のようになります(MySQLが文句を言って?いるバイトはどこにありますか)。0xBD

DPM 912は大きい3ですか?桁 

「DPM912」のグーグルの少しは、キャラクターが下品な半分の分数、1/2であるべきだと私に示唆しています。

多くの文字セットがその文字をバイト0xBDでエンコードしますが、特に1つは飛び出します:windows-1252—これは(Unicode以前の)Windowsの世界のデフォルトのコードページであるだけでなく、MySQLのデフォルトのエンコードでもあります。データがでエンコードされていると推測できますwindows-1252

MySQLのマニュアルで説明されているように、文字列リテラルのエンコーディングを指定するには、文字列リテラルの前にエンコーディング名を付けます。

文字列リテラルには、オプションの文字セットのイントロデューサとCOLLATE句が含まれる場合があります。

[_charset_name]'string' [COLLATE collat​​ion_name]

それは続けて言う:

イントロデューサは、標準の16進リテラルおよび数値の16進リテラル表記(x'literal'および0xnnnn)の前、またはビットフィールドリテラル表記(b'literal'および0bnnnn)の前でも有効です。

したがって(そしてMySQLはを参照しているためwindows-1252) 、コマンドを次のようにlatin1変更できます。INSERT

INSERT INTO products2 VALUES (25, _latin1 0x5468652044504D203931322069...);

ドキュメントには次のようにも記載されています。

単純なステートメントの場合、文字列には、およびシステム変数SELECT 'string'によって定義された文字セットと照合が含まれます。character_set_connectioncollation_connection

つまり、そのようなイントロデューサが省略された場合(元のステートメントの場合のように)、文字セットはシステム変数INSERTによって定義されたものと見なされます。character_set_connection

ここで述べたように、その変数を設定する方法はいくつかあります(クライアントが接続するときに変数を指定するなど、phpMyAdminでは[DefaultCharset]構成オプションが設定されています。デフォルトはlatin1v3.4より前ですが、それutf8以降は-おそらく、この変更が問題の原因です。インポートファイルの文字セットを[Import][charset])で指定することもできます。接続時に目的の文字セットを指定しない場合は、接続後、INSERTコマンドが修正する前にこれらのコマンドのいずれかを発行します(たとえば、ダンプファイルの先頭にそれらの1つを追加できます)。

SET NAMES 'latin1';
SET CHARACTER SET latin1;
SET character_set_connection = latin1;

ダンプファイルを可能な限り移植可能にする私の推奨事項は、SET NAMES 'latin1'その先頭に追加することです。

于 2012-05-02T15:48:23.863 に答える