b.l0g.jp     About     Archive     Feed

symfonyでデータをMySQLにロードする際のduplicate entryエラー

symfony 1.4.6 + XAMPP 1.7.3(Windows)で、ありがちなエラーではまったので、メモ。

symfonyのschema.ymlとfixture.ymlを記述して、
# symfony doctrine:build -all -and-load -no-confirmation
で、一気にデータベースの再構築とデータのロードを行おうとしたところ、以下のエラー発生。
>> doctrine  created tables successfully
>> doctrine  Loading data fixtures from "C:\…\Eclipse\symfony\data/fixtures"
>> doctrine  Loading data fixtures from "C:/…trineGuardPlugin/data/fixtures"
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '????' for key 'name'
当たり前だが、fixture.ymlでは重複するような値を定義してはいない。????というのが気になるが、これは何?
どうやらこれは、データベースの文字コードがlatin1などになっている場合に起きるようである。データベースの文字コードをUTF-8にすると共に、fixture.ymlに日本語のキーが含まれている場合、こちらの文字コードもUTF-8にする(Windowsではメモ帳などを使って編集すると普通Shift-JISになるので注意)。
[mysqld]
default-character-set=utf8
character_set_server=utf8
skip-character-set-client-handshake
[mysql]
default-character-set=utf8
XAMPPのインストールフォルダ以下、mysql\bin\my.ini ファイル内の各項目に、上記を追記し、
net stop mysql   # MySQLサービス停止
net start mysql  # MySQLサービス開始
mysql -uroot -p パスワード
mysql> drop database データベース名;   # 念のためDB削除
mysql> create database データベース名;   # 念のためDB再作成
としてMySQL再起動、データベース再作成をしてからもう一度
# symfony doctrine:build -all -and-load -no-confirmation
とすれば、すんなりデータベースを作成できる。
なお、自分がやったときには、MySQLのstatusコマンドではUTF-8になっていたのに、どうしても上記のDuplicate entryのエラーが出てしまい、混乱した。
mysql  Ver 14.14 Distrib 5.1.41, for Win32 (ia32)
Connection id:          5
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.1.41 Source distribution
Protocol version:       10
Connection:             Named pipe: MySQL
Client characterset:    UTF-8
Server characterset:    UTF-8
UNIX socket:            MySQL
Uptime:                 9 min 40 sec
この場合、以下のコマンドでも確認し、全部の設定がUTF-8に揃っているかを見てみるべし。
mysql> show variables like 'char%';
+---------+--------------+
| Variable_name            | Value                                  |
+---------+--------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | C:\eclipse\xampp\mysql\share\charsets\ |
+---------+--------------+
8 rows in set (0.00 sec)
どれかがlatin1などのままならば設定が不十分なので、もう一度my.iniを確認すること。

海外の役立つブログ記事などを人力で翻訳して公開するYakstというプロジェクトをやっています。よろしければそちらもどうぞ!