2016-09-22 9 views
3

MySQLテーブルに値を挿入しようとすると、この例外が発生する java.sql.SQLException: Incorrect string value: '\xC2\x99 Adm...' for column\ xC2 \ x99は、2バイト文字のU + 0099(または\ u0099)にマップされています。ドキュメントから、3バイト以下の文字はMySQLのUTF-8でサポートされています。私はutfmb4についても読んでいますが、この文字は2バイトであり、まだこのエラーが出ているので、問題は別のものかもしれません。提案してください。MySQLのUTF-8文字サポート

+0

挿入を実行しようとしている列/テーブルのエンコーディングとは何ですか? –

+0

MySQLは大量の文字セットとエンコーディングをサポートしていますが、何も推測しようとしません。プログラムは、接続に使用したい文字セット/エンコーディングをプログラムに通知する必要があります。 MySQLの[キャラクタセットサポート](http://dev.mysql.com/doc/refman/5.7/en/charset.html)の詳細を読む。 – axiac

+0

@TimBiegeleisenごめんなさい正確なフィールドを確認するようにアドバイスしていますか?私はこのテーブル/列のcharacter_set_nameをチェックしてlatin1です。 –

答えて

2

デフォルト照合latin1_swedish_ciを使用しているようですが、を使用する必要があります。これは、UTF-8のデータを列に格納することを意味しています。

ALTER TABLE your_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
+0

私が混乱するのは、U + 0099が実際にISO-8859-1エンコーディングに属していることです。私はいつもMySQLが適切な変換を行うと仮定していました。 –

+0

@ÁlvaroGonzález、あなたは自動変換を意味しますか?そうではないと思います... select文であれば、特定の文字セットで照合するようにカラム結果を問い合わせることができますが、INSERTでは実際にはわかりません。 – Rahul

+0

それは確かです。私はUTF-8クライアントを使用して、すべての種類の照合を使用してテーブル内のデータを正常に格納および取得します。どんなところでも、私はちょうどこれを説明できる奇妙な事実を思い出した。 –

1

を設定Character Sets and Collations in MySQL

にMySQLのマニュアルを参照してくださいあなたが照合文字を変更しALTERコマンドを使用することができます文字U+0099(別名'<control>'は)確かにencoded in Latin-1 aka ISO-8859-1ことができる(具体的には、それは0x99だ)との接続がに表示されますUTF-8を使用するように正しく構成されている必要があります。 does not have a position for U+0099

mysql> SHOW CHARACTER SET like 'Latin1'; 
+---------+----------------------+-------------------+--------+ 
| Charset | Description   | Default collation | Maxlen | 
+---------+----------------------+-------------------+--------+ 
| latin1 | cp1252 West European | latin1_swedish_ci |  1 | 
+---------+----------------------+-------------------+--------+ 
1 row in set (0.00 sec) 

とWindows 1252:latin1 does not mean ISO-8859-1

私はこの問題は、MySQLのクセである疑いがある

(また、ラテン1と呼ばれる)

ISO-8859-1は、Windowsと同じですコードポイント128-159(0x80-0x9F)を除いて、-1252( はCP1252と呼ばれます)。 ISO-8859-1は、この範囲内でいくつかの制御コードを割り当てます。 Windows-1252 には、これらのコードポイントに割り当てられた複数の文字、句読点、算術およびビジネス記号 があります。 MySQLのマニュアルのWest European Character Setsから

latin1のは、デフォルトの文字セットです。 MySQLのlatin1は Windows cp1252文字セットと同じです。これは、IANA latin1が0x80 と0x9fの間のコードポイントを "未定義"として扱う点を除いて、 公式ISO 8859-1またはIANA(Internet Assigned Numbers Authority) latin1と同じであることを意味します。 latin1、 これらの位置に文字を割り当てます。たとえば、0x80はユーロ 記号です。 cp1252の「未定義」エントリの場合、MySQLは0x81を Unicode 0x0081に、0x8dを0x008dに、0x8fを0x008fに、0x90を0x0090に、 を0x9dから0x009dに変換します。

要約すると、latin1列を使用してそのような文字を格納することはできません。アプリで既にUTF-8を使用しているので、データベースをutf8にアップグレードするか、さらにはutf8mb4にアップグレードすることを検討する必要があります。

関連する問題