长描述性标题的方式。
问题是,如果我有一个定义为这样的教义领域
#[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
是什么,我真正能收集到的是,它是某种数据进入时的转换模式?再次,我不太确定引擎盖下发生了什么,绝对需要一些帮助。谢谢!
1条答案
按热度按时间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模拟数据库行为。否则,您需要修复迁移,以使数据库根据字符而不是字节来调整列的大小。