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 事件监听器