Как я могу запросить на японском языке на активной записи Rails? - PullRequest
1 голос
/ 02 ноября 2019

Я хочу сделать запрос на японском языке на Ruby on Rails. В моем текущем коде он не работает и возвращает только пустой набор. База данных MYSQL 8.0 работает в докере с настройками по умолчанию. Должен ли я обновить конфигурацию MYSQL?

Вот мой запрос выбора и схема.

Запрос активной записи

@internships = Internship.where("subject LIKE :keyword OR content LIKE :keyword", keyword: params[:keyword]).all

Схема

create_table "internships", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci" do |t|
    t.date "start_date"
    t.date "end_date"
    t.integer "employment_number"
    t.bigint "company_id"
    t.text "content"
    t.string "subject"
    t.integer "job_type"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.date "deadline_date"
    t.text "summary"
    t.index ["company_id"], name: "index_internships_on_company_id"
  end

MYSQL charset

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8                           |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)

Заранее спасибо.

1 Ответ

2 голосов
/ 02 ноября 2019

UTF-8

UTF-8 - это кодировка для набора символов Unicode, которая поддерживает практически все языки мира.

Единственное отличие заключается в сортировке вашегорезультаты, разные буквы могут прийти в другом порядке на других языках. Кроме того, сравнение a с ä может вести себя по-другому в другом сопоставлении.

utf8mb4_unicode_ci

Для символа BMP utf8 и utf8mb4 имеют одинаковые характеристики хранения: одинаковые кодовые значения, одинаковыекодировка, той же длины

Для дополнительного символа utf8 не может хранить символ вообще, в то время как utf8mb4 требуется четыре байта для его хранения. Поскольку utf8 не может хранить символ вообще, у вас нет дополнительных символов в столбцах utf8, и вам не нужно беспокоиться о преобразовании символов или потере данных при обновлении данных utf8 из более старых версий MySQL.

Итаквам лучше изменить
character_set_client, character_set_connection, character_set_results на utf8mb4

Решение:

Для базы данных:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Для таблицы:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Для столбца:

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Изменить файл конфигурации my.cnf

> vim /etc/my.cnf
# 
[client]
default-character-set = utf8mb4

# 
[mysql]
default-character-set = utf8mb4

# 
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

> service mysqld restart
...