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=utf8character_set_server=utf8skip-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: 5SSL: Not in useUsing delimiter: ;Server version: 5.1.41 Source distributionProtocol version: 10Connection: Named pipe: MySQLClient characterset: UTF-8Server characterset: UTF-8UNIX socket: MySQLUptime: 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を確認すること。