Как сделать поиск данных из mysql которые сохраненны в формате unicode?
У меня есть такой кусок кода которых выполняет поиск по заданым параметрам из баззы даных. Но в базе сохранены разные языки, и некоторые в формате Unicode (вьетнамский язык). И соответственно поиск не видит етих данных.
Как сделать так чтобы поиск работал ?
/* Search */ if($this->search && $this->search_by) { $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; } |
/* Search */ if($this->search && $this->search_by) { $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; }
И данные в базе:
по картинке видно что некоторые символы в формате unicode + english
+ как сделать так чтобы он искал не в целом столбце settings а конкретно в "meta_description":
P.S. иди можно сделать сохранене данных в нормальном формате и тогда будет поиск работать?
Дополнительно:
Эта строка просто не работает.
$where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; |
$where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'";
- Всмысле? $table_prefix, $this->search_by и сам $this->search (поисковый запрос все определенно выше по коду.)
Целая функция:
public function get_sql_where($table_prefix = null) { if(!$this->is_processed) $this->process(); $where = ''; $table_prefix = $table_prefix ? "`{$table_prefix}`." : null; /* Filters */ foreach($this->filters as $key => $value) { if(isset($this->filters_types[$key])) { switch($this->filters_types[$key]) { case 'json_contains': /* Only allow numbers for array json searching */ $value = (int) $value; $where .= " AND JSON_CONTAINS({$table_prefix}`{$key}`, '{$value}', '$')"; break; } } else { /* Classic */ $where .= " AND {$table_prefix}`{$key}` = '{$value}'"; } } /* Search */ if($this->search && $this->search_by) { $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; } return $where; }
public function get_sql_where($table_prefix = null) { if(!$this->is_processed) $this->process(); $where = ''; $table_prefix = $table_prefix ? "`{$table_prefix}`." : null; /* Filters */ foreach($this->filters as $key => $value) { if(isset($this->filters_types[$key])) { switch($this->filters_types[$key]) { case 'json_contains': /* Only allow numbers for array json searching */ $value = (int) $value; $where .= " AND JSON_CONTAINS({$table_prefix}`{$key}`, '{$value}', '$')"; break; } } else { /* Classic */ $where .= " AND {$table_prefix}`{$key}` = '{$value}'"; } } /* Search */ if($this->search && $this->search_by) { $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; } return $where; }
- У нас нет доказательств что срабатывают все conditions и мы заходим в следующий блок.
/* Search */ if($this->search && $this->search_by) { $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; }
/* Search */ if($this->search && $this->search_by) { $where .= " AND {$table_prefix}`{$this->search_by}` LIKE '%{$this->search}%'"; }
Распечатай на экране то что возвращает эта функция. Может она возращает это в странном виде?
Может здесь пустая строка? Может кодировка не та?Да мало-ли чего.
Понимаешь тут половина топиков в хабре закрываются ответами самих авторов. Только
я как Аристотель или как Платон должен ходить и задавать наводящие вопросы. - mayton2019, выводит список статей по заданым паараметрам фильтра, но так или иначе в базе все иероглифы и вьетнамские буквы которые не похожи на английский сохраняються так как на картинке выше.
на сайте все красиво и все как надо, читаемо. Только сама форма фильтра исходя из переменной $this->search не распознает поисковый запрос nghiệp toàn quốc потому что он в базе сохранен как nghiu1ec7p tou00e0n quu1ed1c потому поиск и не проходит - Vasyl Vandych, смотри. Ты кружишся по кругу потому что не можешь определить какой формат представления Вьетнамского языка является коррекным для хранения в PHP, JSON, MySQL.
Не пиши сложных и умных функций. Сделай просто тест. Возмьи 1 вьетнамскую букву.
Запиши ее в строку на языке PHP. Потом запиши ее в базу. Потом прочти ее из базы.
Выведи на экран (в каноническом Unicode представлении). Потом найди эту строку по
простому фильтру равенства WHERE field1 = "u......"Вот так. Тихой сапой. Иди по чеклисту.
- mayton2019, я не понимаю почему оно сохраняет meta_description вьетнамские буквы в юникоде, а если сам url созраняет на вьетнамском, при том что в 2х столбцах одинаковые кодировки.
- Мне трудно комментировать скриншоты. По возможности делай листинги кода. Или логи.
По поводу JSON. Я даю тебе ссылку на вот эту бумажку ECMA-404
https://www.ecma-international.org/wp-content/uplo...
Почитай как JSON хранит Unicode символы. И поскольку ты проигнорировал мое первое задание.
Я даю тебе еще второе задание. Сделать тоже самое. Только охранить в базу вьетнамский символ
не в string. А в JSON. И прочитать его. И убедитсья что он прочитан правильно.Я думаю после этого у тебя отпадут все вопросы.
- mayton2019, почитал твой файлик .pdf Залетел на stackoverflow и решил так : JSON_UNESCAPED_UNICODE Не кодировать многобайтовые символы Unicode (по умолчанию они кодируются как uXXXX).
И какбы все) - Vasyl Vandych, заработало?
- mayton2019, да заработало, добавил к $settings = json_encode($settings, JSON_UNESCAPED_UNICODE); и все сохраняется в том виде что юзер забивает, без юникода, ну и поиск естественно заработал)
Там кстати можно еще просто 256 добавить, но я не до конца понял что от чего отличается. - Vasyl Vandych, это битовая маска, и JSON_UNESCAPED_UNICODE = 256
Надо сделать сохранение данных в нормальном формате и тогда будет поиск работать.
Но для этого надо сначала научиться пользоваться базой данных, потом разработать нормальную структуру, и хранить данные как положено - каждое поле отдельно, а не всё одной в помойной куче.
- К этому я дойду чуть позже. Не все сразу. Спасибо за ответ.
Ответы:
Вы храните данные в json, посмотрите на набор функций json_ в MySQL
Еще у вас юникод декодирован - значит на входе в поиске строку передавайте тоже в декаде уникод, но потеряете часть функционала MySQL (collation)
Так что лучше используйте функцию например отсюда https://stackoverflow.com/questions/11062330/mysql...
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос



Для того чтобы выполнить поиск данных из MySQL, которые сохранены в формате Unicode, необходимо учитывать несколько важных моментов.
1. Убедитесь, что ваша база данных MySQL настроена для хранения данных в кодировке UTF-8. Это можно сделать при создании базы данных или изменить кодировку уже существующей базы данных с помощью следующего SQL запроса:
```sql
ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_unicode_ci;
```
2. При создании таблицы укажите, что поля будут использовать кодировку UTF-8:
```sql
CREATE TABLE tablename (
column1 VARCHAR(255) CHARACTER SET utf8,
column2 TEXT CHARACTER SET utf8
);
```
3. При вставке данных в таблицу убедитесь, что данные также сохранены в кодировке UTF-8. Например:
```sql
INSERT INTO tablename (column1, column2) VALUES ('Привет', 'Пример текста на русском языке');
```
4. Для выполнения поиска данных в кодировке Unicode используйте ключевое слово `COLLATE` с нужной кодировкой. Например, для поиска данных в кодировке utf8_unicode_ci:
```sql
SELECT * FROM tablename WHERE column1 COLLATE utf8_unicode_ci LIKE '%Поиск%';
```
5. Если вы используете PHP для выполнения запросов к базе данных, убедитесь, что соединение с базой данных также установлено с кодировкой UTF-8. Например:
```php
$mysqli = new mysqli('localhost', 'username', 'password', 'dbname');
$mysqli->set_charset('utf8');
```
Следуя этим шагам, вы сможете успешно выполнять поиск данных из MySQL, которые сохранены в формате Unicode.