Как сделать поиск данных из mysql которые сохраненны в формате unicode?

Ссылка скопирована
1 ответ

У меня есть такой кусок кода которых выполняет поиск по заданым параметрам из баззы даных. Но в базе сохранены разные языки, и некоторые в формате 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}%'"; }

И данные в базе:

Как сделать поиск данных из mysql которые сохраненны в формате unicode?

по картинке видно что некоторые символы в формате 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х столбцах одинаковые кодировки.

    Как сделать поиск данных из mysql которые сохраненны в формате unicode?

    Как сделать поиск данных из mysql которые сохраненны в формате unicode?

  • Мне трудно комментировать скриншоты. По возможности делай листинги кода. Или логи.

    По поводу 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...

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

Для того чтобы выполнить поиск данных из 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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно