0

テーブルの主キーである列があり、発音記号または通常のテキストを含めることができます。

私はこれらの2つの値を持っています:

Håbo and Habo

これらの 2 つの列の値をテーブルに挿入したいのですが、エラーが発生します。

DBD::mysql::st execute failed: Duplicate entry 'Habo' for key 'PRIMARY'

Håboがすでに挿入されていることを確認すると、両方の値が同じように扱われているため、主キー違反です。

私のコード:

$dbh = DBI->connect($dsn, $user, $pass)
            or die "Unable to connect: $DBI::errstr\n";
$dbh->{'mysql_enable_utf8'}=1;
$dbh->do('SET NAMES utf8');
my $sql = sprintf "INSERT INTO search_term values(%s, %s)", $dbh->quote($search_term), "Data";

私のテーブルの説明

mysql> desc search_term;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| search        | varchar(200) | NO   | PRI | NULL    |       |
| site          | varchar(500) | NO   |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

MySQL で両方の値を異なるものとして扱い、挿入するにはどうすればよいですか? 助言がありますか?

4

1 に答える 1

1

デフォルトでは、MySQLはUnicode Collat​​ionと呼ばれるものを使用して、Unicode を「同等の」ASCII に「便利に」変換します。MySQL の多くの「便利な」機能と同様に、これがあればもっと便利です。それらの「言葉」の周りに十分な「引用符」を付けることができません。

幸いなことに、修正は非常に簡単ですが、明らかではありません。まず、テーブルの文字セットを UTF8 に変更して、テキストが utf8 で保存されるようにします。次に、照合を utf8_bin に変更して、比較が正確に行われるようにします。utf8_bin が 100% 正しいことであると 100% 確信しているわけではありませんが、機能します。

ALTER TABLE search_term CONVERT TO CHARACTER SET utf8;
ALTER TABLE search_term COLLATE utf8_bin;

将来、MySQL でテーブルを作成するときは、必ず作成に追加CHARACTER SET utf8してください。

CREATE TABLE search_term (
    search varchar(200) primary key,
    site varchar(500)
)
CHARACTER SET utf8
COLLATE       utf8_bin;

最後に、すべてのテーブルに対してこれを行う必要がないように、これらのデフォルトを使用してデータベースを作成できます。

これは、MySQL の Unicode の問題点とその修正に関する良い投稿です。

Perl 側では、use utf8MySQL に渡す文字列が utf8 でエンコードされていることを確認してください。

最後に、DBD::mysql manualによると、接続後ではなく、接続時に UTF8 サポートをオンにする必要があります。警告を発せばよかったのに。

Additionally, turning on this flag tells MySQL that incoming data should be
treated as UTF-8. This will only take effect if used as part of the call to
connect(). If you turn the flag on after connecting, you will need to issue
the command SET NAMES utf8 to get the same effect.

これに接続を変更します。

# I threw in RaiseError because its generally a good idea.
my $dbh = DBI->connect($dsn, $user, $pass, { mysql_enable_utf8 => 1, RaiseError => 1 });
于 2012-10-11T10:08:11.440 に答える