我的模型的属性之一是 JSON 类型。如果我在 JSON 中使用希腊字符(“μ”等),它们会在 MariaDB 中自动编码为 unicode 字符(例如“μ”被键入为“bc”)。当我使用 Eloquent 获取数据时,数据会自动转换为有效字符。但是,如果我想通过“whereJsonContainsKey”在 JSON 中搜索包含字符“μ”的键,则找不到任何记录。对于常规字符,将正常搜索数据。如何使用非标准字符搜索行?
我以这种方式创建数据:
$unit = Unit::factory()->create();
$unit->name = 'Some name';
$unit->unit = 'Ω';
$unit->prefixes = ['μ' => 0.000001, 'k' => 1000, 'M' => 1000000];
$unit->save();
然后当我想取时:
$u = Unit::whereJsonContainsKey('prefixes->μ')->first();
$u = null,但是当$u = Unit::whereJsonContainsKey('prefixes->k')->first();
数据已正确获取。
问题是基于json编码时,unicode多字节字符默认使用
\uXXXX
进行编码。此行为基于 php 本身提供的 json_encode
函数。json_encode
文档中的陈述,该函数接受一堆位掩码形式的标志,其中一个标志是 JSON_UNESCAPED_UNICODE
。
JSON_UNESCAPED_UNICODE(整数)
按字面意思对多字节 Unicode 字符进行编码(默认转义为 \uXXXX)。
一个可行的解决方案是使用上面的标志(如
json_encode($value, JSON_UNESCAPED_UNICODE)
)强制 json_encode 对多字节 unicode 字符进行字面编码。