2016-07-17 10 views
1

は、私は次のエラーを得た:ドクトリン:(原因エスケープへの)列の長すぎるデータ

「名前」欄に255文字の長さであるが、出力が台無しにそれをエスケープするようです。私は何を間違えたのですか?私のmy.iniから

 foreach ($csv as $row) { #persist every part 
      $part = new Part(); 
      $part->setCode($row[0]); 
      $part->setName($row[1]); 
      $part->setPrice(preg_replace("/[^0-9.]/","", $row[2])); # extract decimal number 
      $part->setInStock(($row[3])?1:0); 

      $em = $this->getDoctrine()->getManager(); 
      $em->persist($part); 
      $count++; # get number of commits 
     } 

     $em->flush(); 

An exception occurred while executing 'INSERT INTO parts (deletedAt, name, code, price, in_stock) VALUES (?, ?, ?, ?, ?)' with params [null, "\x50\x6f\x73\x74\x4e\x4c\x20\x50\x72\x69\x6f\x72\x69\x74\x79\x20\x50\x61\x6b\x6b\x65\x74\x20\x41\x61\x6e\x67\x65\x74\x65\x6b\x65\x6e\x64\x20\x42\x65\x6c\x67\x69\xeb", "1101012", "12.00", 0]:

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'name' at row 1 500 Internal Server Error - DriverException 2 linked Exceptions: PDOException » PDOException »

[client] 
port = 3306 
socket = /tmp/mysql.sock 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 
no-auto-rehash 

[mysqld] 
port = 3306 
collation-server  = utf8mb4_unicode_ci 
init-connect   = 'SET NAMES utf8mb4' 
character-set-server = utf8mb4 
skip-character-set-client-handshake 
+0

出力エスケープとはどういう意味ですか?これはSymfonyのメッセージです。 em-> flush()を実行する直前にコントローラコードを表示できますか?特にあなたは 'name'のために何をしているのですか?それはすべてのエスケープコードを持つものです。 –

+0

255文字以上のデータを永続化しようとしている場合(エラーメッセージが表示されない可能性が高いと思われる)、列のサイズを増やしてください。 – Cerad

+0

は要求されたコードを追加しました。文字列を約5文字に切り詰めると機能しますが、それは明らかに私が望むものではありません。 – bluppfisk

答えて

1

だからそれは二つの問題があったが判明しました。

1つは、DoctrineがMySQLサーバーによって設定されたデフォルトの照合順序を無視していたことです。config.ymlなどのオプションも無数にあります。最後に、このように見えます。しかしそれは今働く。

charset: utf8mb4 
default_table_options: 
    charset: utf8mb4 
    collate: utf8mb4_unicode_ci 
options: 
    charset: utf8mb4 
    collate: utf8mb4_unicode_ci 
    1002: "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'" 

第二には、私はデータベース(csvファイル)にロードしようとしていたデータのソースがUTF8で明らかにしなかったということでした。それを「utf8」に保存することで問題は解決しました。今、私はどのように私は希望の形式に入力を変換するPHPを作ることができますか?

関連する問題