WHERE句で大文字と小文字を区別して検索する方法は?


21

SQLクエリで大文字と小文字を区別した検索が必要です。ただし、デフォルトでは、MySQLは文字列の大文字と小文字を考慮しません。

SQLクエリで大文字と小文字を区別して検索する方法に関するアイデアはありますか?

回答:


22

デフォルトでは、MySQLは文字列の大文字と小文字を区別しません

これはまったく正しくありません。create databaseMySQLを使用する場合は常に、データベース/スキーマに文字セットと照合順序があります。各文字セットにはデフォルトの照合があります。詳細については、こちらをご覧ください。

文字セットのデフォルトの照合latin1latin1_swedish_ci、たまたま大文字と小文字を区別しません。

たとえば、大文字と小文字を区別する照合を選択できますlatin1_general_csMySQL grammar)。

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

これは、グループ化や平等のようなものに影響を与えます。例えば、

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

大文字と小文字を区別するデータベースでは、次を取得します。

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

大文字と小文字を区別しないデータベースでは、次のものが得られます。

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

クエリ内から照合順序変更することもできます。たとえば、大文字と小文字を区別するデータベースでは、次のことができます

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

13

MySQLは着実に開発されているため、使用しているMySQLのバージョンを常に質問に明記する必要があります。

さて、質問に戻ります。

MySQLで文字列関数は、常にあなたが関数のいずれかを使用することができますので、大文字と小文字が区別されLOCATEPOSITIONまたはINSTR

例えば:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

正規表現(RLIKEまたはREGEXP)を使用したパターンマッチングでは、最新の3.23.4を除くすべてのバージョンのMySQLで常に大文字と小文字が区別されます。

例えば:

SELECT phone FROM user WHERE user_name REGEXP 'term';

通常の比較(=)とSQLパターンマッチング(LIKE)の両方の場合、動作は関連するフィールドによって異なります。

a。CHARVARCHAR、およびテキストフィールドの全ての変異体は、ケースの小文字を区別しない比較でください。

b。CHAR BINARYVARCHAR BINARY およびBLOBフィールドのすべてのバリアントは大文字と小文字を区別して比較します。

(a)のフィールドを(b)のフィールドと比較する場合、比較では大文字と小文字が区別されます(大文字と小文字の区別が優先されます)。MySQLリファレンスマニュアルの「7.2.7文字列型」の章を参照し、並べ替えと比較に関するステートメントを探してください。

V3.23.0以降BINARYでは、関連するフィールドのタイプに関係なく、キャスト演算子を使用して大文字と小文字の区別を強制的に比較することもできます。MySQLリファレンスマニュアルの「7.3.7キャスト演算子」の章を参照してください。

したがって、user_nameのタイプを変更するか、V3.23.xで次のようなことを試してください。

SELECT phone FROM user WHERE BINARY username LIKE '%term%';

1

、私の状況では、私がアクセス2010を使用していますが、私は同じ問題を抱えていた、まだ解決策が異なっている:使用StrComp()機能とゼロになるために、そのリターンをテストします。

StrComp( thing, 'abc', 0) = 0

そのためStrComp()戻り-1最初の引数は、「小さい」であれば1、それは「大きな」で、あれば0、それは「等しい」の場合は、ときStrComp()=0、あなたは大文字と小文字を区別した一致を持っています。

参照してください。ここでここここ


0

これは、文字セットに関係なくMySQLで機能します。SELECT 'test' REGEXP BINARY 'TEST' as結果; 「BINARY」を入力すると、バイナリ比較が強制されます。


-2

インセンシティブな検索のためにこれを試してください、それは素晴らしいパフォーマンスでうまく動作します

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.