Symfony长度Assert不工作时,使用umlaut(或另一个unicode字符)与教义字段与字符串限制在oracle数据库

ltskdhd1  于 2023-03-29  发布在  Oracle
关注(0)|答案(1)|浏览(93)

长描述性标题的方式。
问题是,如果我有一个定义为这样的教义领域

#[ORM\Column(name: 'department', length: 50, nullable: true)]
    #[Assert\Length(max: 50)]
    protected ?string $department;

提供正好50个字符的字符串可以正常工作,正如预期的那样。
但是,指定Laboratorio de Análisis por Activación Neutrónica(长度为49个字符)最终会在数据库上抛出一个约束冲突,抱怨字符串为52个字符,超过了50个字符的限制。
这是因为(理所当然地)Assert\Length在后台使用了mb_strlen,但是进入数据库的实际字符长度更长。
我试着研究数据库如何存储数据,连接字符串使用charset=AL32UTF8,我相信这是正确的(至少对于连接)?我可能错得很离谱,我对Oracle DB的了解不如我对MySQL/MariaDB和Postgres的了解。
我运行了下面的代码来查看如何在列上设置格式

SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, CHARACTER_SET_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'DB_NAME' AND TABLE_NAME = 'TBL_NAME'
色谱柱名称数据类型数据长度字符集名称
部门可变电荷2五十CHAR_CS
职位可变电荷2一百CHAR_CS
……………………

我已经研究了CHAR_CS是什么,我真正能收集到的是,它是某种数据进入时的转换模式?再次,我不太确定引擎盖下发生了什么,绝对需要一些帮助。谢谢!

vs91vp4v

vs91vp4v1#

Symphony Length documentation提供以下选项:
∮ ∮ ∮ ∮ ∮一个月一个月
类型:string默认值:Length::COUNT_CODEPOINTS
用于长度检查的字符计数单位。默认情况下使用mb_strlen,它对Unicode码位进行计数。
可以是Length类的下列常量之一:

  • COUNT_BYTES:使用strlen计算字符串的字节长度。
  • COUNT_CODEPOINTS:使用mb_strlen计算Unicode码位中字符串的长度。这是Symfony 6.2之前的唯一行为,自Symfony 6.3以来是默认行为。简单(多字节)Unicode字符计为1个字符,而例如ZWJ合成表情符号序列计为多个字符。
  • COUNT_GRAPHEMES:使用grapheme_strlen计算字符串的长度,即偶数表情符号和合成表情符号的ZWJ序列计为1个字符。

由于ORM似乎对基础列使用VARCHAR2(50 BYTE)(而不是VARCHAR2(50 CHAR)db<>fiddle),您似乎希望计算字节数,并且希望包括选项countUnit: Length::COUNT_BYTES以使Symphony模拟数据库行为。否则,您需要修复迁移,以使数据库根据字符而不是字节来调整列的大小。

相关问题