环回 4 + MySQL:字符集"utf32_bin"不能与调用regexp_like中的"二进制"结合使用



我使用的是带有mysql 8.0.22的环回4。当我想执行以下操作时:

let orders = await this.orderRepository.find({
where: {events: {regexp: new RegExp(`.*"id":${event.id}.*`)}},
});

我得到以下错误:

500 Error: UNKNOWN_CODE_PLEASE_REPORT: Character set 'utf32_bin' cannot be used in conjunction with 'binary' in call to regexp_like.

在我的本地主机上,这似乎运行良好,我不知道为什么。

我该怎么解决这个问题?

如果使用区分大小写的RegExp:,则loopback-connector-mysql会将BINARY添加到查询中

https://github.com/strongloop/loopback-connector-mysql/blob/c681b2dbe72b4cf9e75ccc7016f1fc2e8ef6cd1d/lib/mysql.js#L556

MySQL 8.0.22不允许CCD_;非二进制";类型(CHAR、VARCHAR、TEXT等(

不管是UTF-8还是16/32。


一个简单的解决方案可以是使用不区分大小写的RegExp:

let orders = await this.orderRepository.find({
where: {events: {regexp: new RegExp(`.*"id":${event.id}.*`, "i")}},
});

或者将字段更改为二进制类型。像VARBINARY、BLOB等(或者JSON,如果您以这种格式存储数据(。

我建议使用utf8,而不是utf32。

utf8和utf16以及utf32是不同的字符集。

很少有人使用utf16,基本上没有人使用utf32。

utf32为每个字符使用4个字节,因此在空间方面效率很低。

我认为(没有证据(8.0的Regexp处理器只处理utf8。

utf8_bin是几个";校勘";对于utf8";字符集";。

最新更新