Doctrine:列数据太长(由于转义)

时间:2016-07-17 18:21:44

标签: doctrine-orm symfony

我收到以下错误:

'name'列长度为255个字符,但似乎输出转义混乱了。我做错了什么?

  

执行'INSERT INTO部件时发生异常(deletedAt,   名称,代码,价格,in_stock)VALUES(?,?,?,?,?)'与params   [空值,   “\ 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 \ 64 \ X20 \ X42 \ X65 \ X6C \ X67 \ X69 \ XEB”   “1101012”,“12.00”,0]:

     

SQLSTATE [22001]:字符串数据,右截断:1406数据太长了   第1行的列'name'500内部服务器错误 - DriverException 2   链接的例外:   PDOException»PDOException»

        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();

来自my.ini:

[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

1 个答案:

答案 0 :(得分: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将输入转换为所需的格式。