2

Mysql 5.1 スキーマにテーブルがあります。このテーブルを作成するステートメントは次のとおりです。

CREATE TABLE `prova` (

  `id` varchar(150) NOT NULL,
  `name` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)

) ENGINE=InnoDb DEFAULT CHARSET=ucs2;

Ubuntu 10.10 で実行されている Java アプリケーションもあり、Connector/J 5.1.14 によってインターフェースされたこのテーブルにレコードを書き込みます。レコードの挿入は、Prepared Statement クラスで行われます。

マークされた文字が異なるいくつかのレコード (例: ('aki kaurismäki','aki kaurismäki') と ('aki kaurismaki','aki kaurismaki')) を挿入すると、2 番目のレコードで重複キー例外が発生します。実行前に PreparedStatement でクエリを出力しようとしましたが、正しいようです (このクエリを mysql コマンド ライン クライアントから手動で実行しようとしたところ、エラーが発生しました)。

どうすればこの問題を解決できますか? 前もって感謝します、アントニオ

4

3 に答える 3

0

これはおそらく、文字にアクセントが付いている場合は同じ文字を比較するように照合が設定されているか、大文字と小文字が異なるだけであることが原因です。アクセント付き文字をこのように比較したい場合は、おそらく照合をバイナリに設定する必要があります。これの欠点は、大文字と小文字が区別されることです。これは、必要な場合とそうでない場合があります。アクセントを区別する照合はないと思いますが、大文字と小文字を区別しません。

于 2011-01-15T13:52:31.103 に答える
0

多分これはテーブルの照合に関連していますか?

照合の効果の例 http://dev.mysql.com/doc/refman/5.0/en/charset-collat ​​ion-effect.html

接続文字セットと照合順序 http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

于 2011-01-15T13:55:46.370 に答える
0

これは、コメントで述べたように、mySQL の Unicode エンコーディングが比較でアクセント付き文字を内部的に正規化するためです。

 kaurismäki = kaurismaki

マニュアルから:

さらに説明すると、次の等式が utf8_general_ci と utf8_unicode_ci の両方で保持されます (これが比較または検索を実行するときの効果については、セクション9.1.7.8「照合の効果の例」を参照してください)。

Ä = A 
Ö = O 
Ü = U

私の理解では、インデックス列を作成するucs2_binことでそれを整理する必要があります。バイナリ比較では、アクセント付き文字は正規化されません。

于 2011-01-15T13:39:14.270 に答える