質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1447閲覧

【MariaDB】同じ文字列なのにバイナリが違う文字列の検索

silyauta

総合スコア12

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2021/06/17 20:10

編集2021/06/18 00:52

はじめまして。

状況

MariaDBを用いて、データベースの作成を行いました。

その後、レコードの検索をしようとしたところ、検索文字列が含まれているにも関わらずヒットしない問題が発生しました。

実行したSQL文は以下となります。

SQL

1SELECT * FROM db WHERE title LIKE '%検索文字列%'

検索対象のカラムはVARCHAR型で、テーブルのエンコーディングはutf8mb4に設定されています。
また、検索文字列とDBに登録されている文字列は日本語です。
※追記
MariaDBのバージョンは10.5となります。

CREATE TABLE `info` ( `id` int(32) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL DEFAULT '', `groups` varchar(128) NOT NULL DEFAULT '', `genre` int(64) NOT NULL DEFAULT 2, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

データはMac向けのアプリケーション(sequel pro)の機能を用いて追加しました。(SQLは用いていません)

試したこと

試しに、レコードから文字列をコピーし、SQLのLIKE句内にペーストして実行してみると、問題なく検索文字列の含まれたレコードを取得できました。

自分で入力した文字列と、レコードに登録されている文字列をテキストエディタで比較したところ、同じ文字列として扱われています。

イメージ説明

しかし、以下のサイトで両者をバイナリに変換したところ、異なる結果となりました。
https://rakko.tools/tools/74/

イメージ説明

※追記
以下が比較したテキストと、それらをバイナリ化したものです。
・バイナリ文字列
ラブライブ(DB)

11100011 10000011 10101001 11100011 10000011 10010101 11100011 10000010 10011001 11100011 10000011 10101001 11100011 10000010 10100100 11100011 10000011 10010101 11100011 10000010 10011001

ラブライブ(手入力)

11100011 10000011 10101001 11100011 10000011 10010110 11100011 10000011 10101001 11100011 10000010 10100100 11100011 10000011 10010110

他のレコードについても調べてみたところ、同様に検索できないものが一部存在し、それらもバイナリ化すると異なるものとなりました。

DB管理アプリのクエリ機能が問題かと思い、Pythonのライブラリを用いてSQLを実行してみたのですが、改善できませんでした。

質問内容

同じ文字列であるにも関わらず、違う文字列として扱われている原因として、どのようなことが考えられるでしょうか。

また、この場合、データベースの該当するレコードをすべて修正しなければ、検索を行うことは不可能なのでしょうか。

ご教授のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/17 21:09

可能なら、そのバイナリ文字列も画像ではなくテキストで張り付けてもらえたらと。 あとテーブル定義などもCREATE TABLE文で提示してください。
CHERRY

2021/06/17 21:55

データベースのバージョンは、いくつですか? また、どのようにデータを挿入しましたか? 何かのツールを使いましたか?
silyauta

2021/06/18 01:02 編集

質問に追記させていただきました。
m.ts10806

2021/06/18 00:36

質問は編集できますので
silyauta

2021/06/18 00:53

失礼いたしました。
guest

回答1

0

ベストアンサー

MariaDBには照合順序という概念があって、「どの文字とどの文字を同一視するか」を、列レベルの設定で変更できます。

投稿2021/06/17 23:02

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/06/17 23:04

> 同じ文字列であるにも関わらず、違う文字列として扱われている原因として、どのようなことが考えられるでしょうか。 濁点・半濁点について、合成済みのコードを使うか、「清音+合成用の濁点」となっているかの違いかと思われます。
silyauta

2021/06/18 01:02

ご回答ありがとうございます。 確認してみたところ、一致しない文字列について、すべて濁音・半濁音のものでした。 以下については、差し支えなければご教授いただけますと幸いに存じます。 [SHOW FULL COLUMNS FROM]を用いて、現在設定されている照合順序を調べてみたところ「utf8mb4_general_ci」となっておりました。 そこで、SQL文にcollate句を追加し、その他の照合順序(utf8mb4_unicode_ci、utf8mb4_unicode_520_ci、utf8mb4_bin)で検索をかけたのですが、濁音が含まれるものは検索できませんでした。 上記の方法では、合成済みのコードと「清音+合成用の濁点」のコードを同一視する設定は不可能なのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問