【问题标题】:Doctrine: data too long for column (due to escaping)学说:数据对于列来说太长(由于转义)
【发布时间】:2016-07-17 18:21:43
【问题描述】:

我收到以下错误:

“名称”列有 255 个字符长,但输出转义似乎把它搞砸了。我做错了什么?

执行 'INSERT INTO 部件(deletedAt, name, code, price, in_stock) VALUES (?, ?, ?, ?, ?)' with 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\x64\x20\x42\x65\x6c\x67\x69\xeb", "1101012", "12.00", 0]:

SQLSTATE[22001]:字符串数据,右截断:1406 数据太长 第 1 行的列“名称”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

【问题讨论】:

  • 输出转义是什么意思?这是一个 Symfony 消息;您可以在执行 em->flush() 之前显示控制器代码吗?特别是您为name 所做的事情!!!!那就是所有这些转义码。
  • 如果您真的想保留超过 255 个字符的数据(考虑到您的错误消息,这似乎不太可能)然后增加列大小。
  • 添加了请求的代码。如果我将字符串截断为大约 5 个字符,它会起作用,但这显然不是我想要的。
  • 为什么不将相应实体中的“名称”属性类型从字符串更改为文本? doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/…
  • 嗨@pavlovich 这实际上是矫枉过正,因为我的字符串永远不会超过 255 个字符。但我现在确实将其更改为“文本”,重新生成实体,删除并重建数据库,但它仍然说数据太长。 SQLSTATE [22001]:字符串数据,右截断:1406 第 1 行的列“名称”的数据太长

标签: doctrine-orm symfony


【解决方案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 将输入转换为所需的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2019-08-04
    • 2015-02-19
    相关资源
    最近更新 更多