Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串

Posted

技术标签:

【中文标题】Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串【英文标题】:Symfony, Doctrine truncates string in Json filed before storing in database 【发布时间】:2021-10-05 19:21:43 【问题描述】:

在 Symfony 4 应用程序中使用 Doctrine 存储我的数据库中的一些 Json 数据时,我遇到了一个奇怪的错误。

json 数据中的某些字符串被截断超过 27 个字符,并在末尾添加 [...],但并非总是如此!

这是我在数据库中获得的数据示例:


  "tests": 
    "test-1": 
      "label": "Test 1",
      "someData": null,
      "uid": "044e0907-82cc-4f53-a325-e62830e59523"
    ,
    "test-2": 
      "label": "Test 2",
      "someData": null,
      "uid": "a204b0a7-0831-4fde-976c-f3a1b0e75655"
    ,
    "test-3": 
      "label": "Test 3",
      "someData": null,
      "uid": "d8f457b1-67d6-4ff7-9378-6c0ce5d9de0a"
    ,
    "test-4": 
      "label": "Test 4",
      "someData": null,
      "uid": "5ddbd2eb-142c-4fbb-a4bc-d6 [...]" // Here is the bug !!!
    ,
    "test-5": 
      "label": "Test 5",
      "someData": null,
      "uid": "e2ee7a1a-e0ae-4f1d-8806-967d94ddb790"
    
  

我花了一些时间来调试它可能会到哪里,在我刷新我的实体之前,属性的数据是好的,但是在刷新之后,有时,一些 uids(超过 27 个字符)是被截断。

$myEntity->setField($field);
$challenge->getField(); // Here the data is OK
$this->doctrine->getManagerForClass(MyEntity::class)->flush();
$challenge->getField(); // Here the data is truncated sometimes

知道这个错误可能来自哪里吗?

教义?数据库(我用 mysql)?

谢谢!

【问题讨论】:

您确定不是您的浏览器(JSON 查看器扩展?)截断了字符串? 嗨,是的,我确定,我显示的数据是使用管理员从我的数据库中检索到的 也许管理员截断了数据? 我不认为它来自Adminer,因为只有当我在Adminer中查看数据时才会出现。但是当我在我的应用程序中检索数据时,我得到了截断的 uid,它破坏了我的代码:/ 【参考方案1】:

经过一番挖掘,我终于找到了这个错误,这是我的代码的错^^

为了解释,在刷新之前,我对数组数据进行了一些转换,使用了一个以值作为参考的 foreach 循环。

所以传递给flush函数的数据数组保留了最后一项的值作为参考。因此,当 DbalLogger 进入操作以记录查询时,它具有缩短过长字符串的 normalizeParams() 函数。 由于某些参数值是通过引用传递的,因此在存储到 DB 之前它也被缩短了!

结论:小心在 foreach 循环中传递引用;)

【讨论】:

以上是关于Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2:在 ContainerAwareCommand 中禁用 Doctrine 事件监听器

Symfony 4 Doctrine存储库不返回一个字段值

Symfony 4 / doctrine插入初始数据库数据

Symfony2,Doctrine,fixtures,数组到字符串的转换

Symfony 2 Doctrine 内存使用情况

Symfony2-Doctrine:ManyToMany 关系未保存到数据库