如何使用 Laravel 在 MariaDB JSON kolumn 中使用 unicode 字符

问题描述 投票:0回答:1

我的模型的属性之一是 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 laravel eloquent mariadb
1个回答
0
投票

问题是基于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 字符进行字面编码。

© www.soinside.com 2019 - 2024. All rights reserved.