我在我的网站上搜索时遇到问题。我有一个搜索输入,用于按名称查找产品。如果我输入“leña”(问题是奇怪的字符)。
这是在控制器中
result = (value1, value2, operation) -> operations.get(operation).apply(value1, value2);
这是数据库中“标题”字段的内容。
$termino = $_POST['search']);
$locale = LaravelLocalization::getCurrentLocale(); //es in this case
$products = Product::where('title', 'LIKE', "%\"{$locale}\":%{$termino}%");
搜索返回0条结果。
我确定问题是编纂,而且我不知道该如何解决。
编码为utf8mb4。
谢谢
答案 0 :(得分:1)
问题并非真正出在非英语字符上。根本问题是,您将复杂的数据格式(JSON)存储在单个数据库单元中,而不是将数据库设计为容纳单个数据:
create table product_title (
product_id int(10) not null,
locale varchar(2) not null,
title varchar(200),
primary key (product_id, locale)
);
insert into product_title (product_id, locale, title) values (1, 'es', 'Leña');
insert into product_title (product_id, locale, title) values (1, 'en', 'Wood');
您有一个关系数据库,但尚未针对数据结构进行设计,因此您无法使用其大多数功能,包括WHERE
或ORDER BY
之类的基本功能。
您可以修复设计(请执行)或应用解决方法:
JSON
type列中输入。您可以创建两个版本的JSON数据,并期望数据库值不存在大小写混合的情况:
$locale = 'es';
$termino = 'Leña';
$data = [
$locale => ":%{$termino}%"
];
$ascii = json_encode($data);
$unicode = json_encode($data, JSON_UNESCAPED_UNICODE);
// Use your framework's syntax instead:
$sql = 'SELECT * FROM product WHERE title IN (:ascii, :unicode)';
$params = [$ascii, $unicode];
请注意,也没有使用LIKE通配符的合理解决方法。