293

これが私の接続の設定方法です。
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);

また、テーブルに行を追加しようとすると、次のエラーが発生します。
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1

何千ものレコードを挿入していますが、テキストに\ xF0が含まれていると、常にこのエラーが発生します(つまり、誤った文字列値は常に\ xF0で始まります)。

列の照合はutf8_general_ciです。

何が問題なのですか?

4

19 に答える 19

377

MySQLutf8では、UTF-8 で 3 バイトで表現できる Unicode 文字のみが許可されています。ここに、4 バイトを必要とする文字があります: \xF0\x90\x8D\x83 ( U+10343 GOTHIC LETTER SAUIL )。

MySQL 5.5 以降を使用している場合は、列のエンコードを からutf8に変更できますutf8mb4。このエンコーディングでは、UTF-8 で 4 バイトを占める文字を格納できます。

また、MySQL 構成ファイルでサーバー プロパティcharacter_set_serverをに設定する必要がある場合もあります。utf8mb4それ以外の場合、Connector/J のデフォルトは 3 バイト Unicode のようです。

たとえば、Connector/J で 4 バイトの UTF-8 文字セットを使用するには、MySQL サーバーを で構成しcharacter_set_server=utf8mb4characterEncodingConnector/J 接続文字列を除外します。その後、Connector/J は UTF-8 設定を自動検出します。

于 2012-06-09T09:16:18.103 に答える
133

含まれる文字列は、UTF-8 を使用して複数のバイトとしてエンコードされた\xF0単純な文字です。

照合順序は utf8_general_ci に設定されていますが、データベース、テーブル、さらには列の文字エンコーディングが異なる可能性があると思われます。これらは独立した設定です。試す:

ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)  
    CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;

VARCHAR(255) を実際のデータ型に置き換えます

于 2012-06-09T00:07:00.403 に答える
79

同じ問題が発生しました。データを保存するには、次のutf8mb4ことを確認する必要があります。

  1. character_set_client, character_set_connection, character_set_resultsutf8mb4:character_set_clientでありcharacter_set_connection、クライアントによって送信されるステートメントcharacter_set_resultsの文字セットを示し、サーバーがクエリ結果をクライアントに返す文字セットを示します。charset-connection
    を参照してください。

  2. テーブルと列のエンコーディングはutf8mb4

JDBC の場合、次の 2 つのソリューションがあります。

解決策 1 (MySQL を再起動する必要があります):

  1. 次のように変更my.cnfし、MySQL を再起動します。

    [mysql]
    default-character-set=utf8mb4
    
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    

これにより、データベースcharacter_set_client, character_set_connection, character_set_resultsutf8mb4デフォルトであることが確認できます。

  1. MySQL を再起動します

  2. テーブルと列のエンコーディングをutf8mb4

  3. jdbc コネクタで と を指定するのをcharacterEncoding=UTF-8やめてください。characterSetResults=UTF-8character_set_clientcharacter_set_connectioncharacter_set_resultsutf8

解決策 2 (MySQL を再起動する必要はありません):

  1. テーブルと列のエンコーディングをutf8mb4

  2. jdbc コネクタでの指定characterEncoding=UTF-8は、jdbc コネクタがサポートしていないためですutf8mb4

  3. 次のようにSQLステートメントを記述します(allowMultiQueries=truejdbcコネクタに追加する必要があります):

    'SET NAMES utf8mb4;INSERT INTO Mytable ...';
    

これにより、サーバーへの各接続が確実になりcharacter_set_client,character_set_connection,character_set_resultsますutf8mb4charset-connection
も参照してください。

于 2016-02-02T15:03:36.817 に答える
20

いくつかのステップのように見えるので、いくつかの投稿を組み合わせて、これに対する完全な回答を作成したいと思いました。

  1. @madtraceyによる上記のアドバイス

/etc/mysql/my.cnfまた/etc/mysql/mysql.conf.d/mysqld.cnf

[mysql]
default-character-set=utf8mb4

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
##
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

再び上記のアドバイスから、すべての jdbc 接続がcharacterEncoding=UTF-8ありcharacterSetResults=UTF-8、それらから削除されました

このセット-Dfile.encoding=UTF-8では、違いはないように見えました。

上記と同じエラーが発生して、まだ国際テキストをデータベースに書き込むことができませんでした

今、このhow-to-convert-an-entire-mysql-database-characterset-and-collat​​ion-to-utf-8を使用しています

使用するすべてのデータベースを更新しますutf8mb4

ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

実行する必要があるものを提供するこのクエリを実行します

SELECT CONCAT(
'ALTER TABLE ',  table_name, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ', 
'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  ')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'YOURDB'
AND
(C.CHARACTER_SET_NAME != 'utf8mb4'
    OR
 C.COLLATION_NAME not like 'utf8mb4%')

エディターで出力をコピーして貼り付けます すべて置換 | 正しいデータベースに接続すると、mysql に何もポストバックされません。

やらなければならなかったことはそれだけで、すべてがうまくいくようです。-Dfile.encoding=UTF-8ではなく、有効になっておらず、期待どおりに動作しているように見えます

E2A まだ問題がありますか? 私は確かに本番環境にあるので、上記で行われたことを確認する必要があることがわかりました。動作しない場合があるため、このシナリオでの理由と修正は次のとおりです。

show create table user

  `password` varchar(255) CHARACTER SET latin1 NOT NULL,
  `username` varchar(255) CHARACTER SET latin1 NOT NULL,

レコードを手動で更新しようとしている人がまだラテン語であることがわかります。

ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

それでは、絞り込みましょう。

mysql> ALTER TABLE user change username username varchar(255) CHARACTER SET utf8mb4 not NULL;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> ALTER TABLE user change username username varchar(100) CHARACTER SET utf8mb4 not NULL;
Query OK, 5 rows affected (0.01 sec)

つまり、更新を機能させるために、そのフィールドのサイズを小さくする必要がありました。

今私が実行すると:

mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

それはすべて動作します

于 2017-04-15T11:42:28.903 に答える
11

私の場合、上記のすべてを試しましたが、何も機能しませんでした。私のデータベースは以下のようになっていると確信しています。

mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using  EditLine wrapper

Connection id:      12
Current database:   xxx
Current user:       yo@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.17-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         42 min 49 sec

Threads: 1  Questions: 372  Slow queries: 0  Opens: 166  Flush tables: 1  Open tables: 30  Queries per second avg: 0.144

だから、私はすべてのテーブルで列の文字セットを調べます

show create table company;

列の文字セットがラテン語であることがわかりました。そのため、中国語をデータベースに挿入できません。

 ALTER TABLE company CONVERT TO CHARACTER SET utf8;

それはあなたを助けるかもしれません。:)

于 2017-03-31T03:01:09.967 に答える
7

私のレールプロジェクトでも同じ問題がありました:

Incorrect string value: '\xF0\xA9\xB8\xBDs ...' for column 'subject' at row1

解決策 1: db に保存する前に、文字列を base64 に変換 Base64.encode64(subject) するBase64.decode64(subject)

解決策 2:

ステップ 1: 件名列の文字セット (および照合順序) を次のように変更します。

ALTER TABLE t1 MODIFY
subject VARCHAR(255)
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

ステップ 2: database.yml で使用

encoding :utf8mb4
于 2017-05-24T18:11:15.340 に答える
5

ただする

ALTER TABLE `some_table` 
CHARACTER SET = utf8 , COLLATE = utf8_general_ci ;

ALTER TABLE `some_table` 
CHANGE COLUMN `description_with_latin_or_something` `description` TEXT CHARACTER SET 'utf8' NOT NULL ;
于 2017-05-23T15:17:43.270 に答える
4

その主な原因は、一部の Unicode 文字です。私の場合、それはルピーの通貨記号でした。

これをすばやく修正するには、このエラーの原因となっているキャラクターを特定する必要がありました。テキスト全体を vi などのテキスト エディターにコピー ペーストし、問題の文字をテキストの文字に置き換えました。

于 2016-04-12T07:09:34.397 に答える
3

私の解決策は、列の型を varchar(255) から blob に変更することです

于 2017-07-07T06:44:17.573 に答える
1

また、utf8mb4 の新しい文字セット内で実行するために、すべてのデータベースのストアド プロシージャ (および関数も) を削除して再作成する必要がありました。

走る:

SHOW PROCEDURE STATUS;

…サーバーの新しい character_set_client、collat​​ion_connection、および Database Collat​​ion 値に更新されていないプロシージャを確認します。

于 2020-06-09T21:27:18.920 に答える