MySQLの大文字と小文字を区別しない選択


242

MySQL SELECTクエリがデフォルトで大文字と小文字を区別するか区別しないかを誰かに教えてもらえますか?そうでない場合、次のようなことを行うためにどのクエリを送信する必要がありますか?

SELECT * FROM `table` WHERE `Value` = "iaresavage"

実際には、の真の値はValueですIAreSavage


44
最終的には、ファイルされた照合に依存します-それが「_ci」(大文字と小文字を区別しない)または「_cs」(大文字と小文字を区別する)の場合
Jovan Perovic

15
これは不適切な言葉の質問です;)。答えの半分は大文字と小文字を区別しない比較を行う方法を示し、半分は大文字と小文字を区別することを目的としています。そして、1だけがデフォルトが実際に大文字小文字を区別しないことを伝えます。:)あなたのような比較を行うとき、その場合の鈍感さに注目することの価値はさらに作品'value' in ('val1', 'val2', 'val3')
SaltyNuts

5
@SaltyNutsの人、7年後にこの質問を読んで、私がいかに多くの初心者であったかが恥ずかしいことに気づきました!ドキュメントを読んだだけで、答えはSELECTステートメントに関する最初の文のようになります...
NoodleOfDeath

@JovanPerovicの発言に加えて、utf8_binでは大文字と小文字が区別されます。それが当時存在していたかどうかわからない
Chiwda

回答:


494

彼らは、あるケース小文字を区別しないあなたがない限り、バイナリ比較を


3
私はほとんどTimのコメントに同意します。どこでも値に「lower()」を実行することが、それを処理するための最良の方法であるとは思いません。しかし、私は時々それが理にかなっていて簡単であると認めます。(Colinはcollat​​eの方が優れていると述べました)履歴データをmysqlテーブルに移動しましたが、特定の列の値で大文字と小文字が区別されないため、レガシーロジックが壊れました。「GE1234」と「ge1234」の違いを知る必要がありました。それらは一意であり、そのように記録されたままである必要があります。代わりに、create tableステートメントで列を次のように設定します。varchar(20)CHARACTER SET utf8 COLLATE utf8_bin
gregthegeek

19
なぜ多くの人がこれに賛成したのか、私にはわかりません。ここでは、dev.mysql.com / doc / refman / 5.0 / en / case-sensitiveivity.htmlに「...これは、アルファベット文字の場合、比較では大文字と小文字が区別されることを意味する」と明記しています。したがって、「DickSavagewood」を検索しても、「dicksavagewood」は取得されません。LOWER()を使用して同じことを行うと、ピックアップされます。だから私の質問への私の答え:あなたの特定のケースでは、SELECTは確かに大文字と小文字を区別します。
Luftwaffle

10
@ user1961753:もう一度お読みください:「バイナリ文字列(varbinary、blob)の場合...大文字と小文字が区別されます」。
マークB

1
@MarcBこのリンクは現在壊れています。直してもらえますか?:)
Phiter

5
Jovanが言ったように、それは照合に依存するので、この答えはかなり間違っています。
phil294 2018年

117

値と渡されたパラメータを小文字にすることができます:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

別の(より良い)方法は、ドキュメントでCOLLATE述べられているように演算子を使用することです


21
このSELECT文はそのときどのように見えるでしょうCOLLATEか?
はいバリー

11
上記の参照ドキュメントページで、「非バイナリ文字列比較では、デフォルトで大文字と小文字が区別されない」と述べています。
Quested Aronssonによる

9
何人がこの回答に賛成したのか、恐ろしいことです。@Marcが上記で説明したように、比較で大文字と小文字が区別されません。照合順序とインデックスを理解し、それらを適切に構成する必要があります。LOWER()または任意のCOLLATE句などの文字列変換を使用すると、インデックスを完全にバイパスできます。また、時間の経過とともに、テーブルが大きくなると、パフォーマンスに大きな影響を与える可能性があります。おそらくこれらはあなたが探しているユーザー名ですか?大文字と小文字を区別しない照合を使用して、一意のインデックスを列に追加します。EXPLAINインデックスが使用されていることを確認するために使用します。
mindplay.dk

1
私はmindplay.dkと同じことを言っていました... upper()とlower()はインデックスをバイパスし、大きなデータベーステーブルのパフォーマンスに直接影響します。
GTodorov 2018

mindplay.dkとGTodorovの意見の両方に同意します。where句のターゲット列でいくつかのメソッドを使用する場合は注意してください。列のインデックスは役に立たない場合があります。EXPLAINを使用してください!
traeper

51

バイナリを使用

これは簡単な選択です

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

これはバイナリの選択です

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

または

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
=(SELECT * FROM myTable WHERE BINARY 'something' = 'Something')の片側だけでBINARYを使用するのはいつ意味がありますか?
ジミー

@ジミー正確にはどういう意味ですか?コードは機能します。比較の片側がバイナリにキャストされると、比較はバイナリで行われます。
ジョリ2014

@Joriああ、私は誤解していると思います-2つの例の1つは、等号の両側にBINARYがあると思いました。
ジミー

これが正解なので、私はこれに賛成票を投じました。MySQLのWebサイトにあるドキュメントによると、BINARYコマンドは特定の言語にタイプキャストするよりも、BINARYコマンドを使用する方が良いと言っています。それが提示されます。だから私が答えを探しに来たとき-ここでの2つの答えは、MySQLのWebサイトに移動し、そのドキュメントを見るように導きました。BINARYを使用することをお勧めします。翻訳は他の問題を引き起こす可能性があります。
Mark Manning

43

比較は、列が(デフォルトの照合など)で終わる照合を使用する場合、大文字と小文字を区別しません。また、列が、または(およびなど)で終わる照合を使用する場合、大文字と小文字を区別します。_ci latin1_general_ci_cs_binutf8_unicode_csutf8_bin照合します)。

照合をチェック

以下を使用して、サーバーデータベース接続の照合順序を確認できます。

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

そしてあなたはあなたを使ってテーブルの照合をチェックすることができます:

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

照合順序を変更

次のように、データベース、テーブル、または列の照合順序を大文字と小文字を区別するものに変更できます。

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

これで、比較で大文字と小文字が区別されます。


25

WHERE句の文字列比較では、大文字と小文字は区別されません。あなたは使用して比較しようとすることができます

WHERE `colname` = 'keyword'

または

WHERE `colname` = 'KeyWord'

同じ結果が得られます。これがMySQLのデフォルトの動作です。

比較で大文字と小文字を区別する場合は、次のように追加できますCOLLATE

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

このSQLでは、次のような結果になりますcolname。WHERECOLLATE latin1_general_cs = 'keyword'

latin1_general_cs ほとんどのデータベースでは、共通またはデフォルトの照合順序です。



9

デフォルトでは大文字と小文字が区別されませんが、次に検討すべき最も重要なことは、最初にテーブルが作成された方法です。これは、テーブルを作成するときに大文字と小文字の区別を指定できるためです。

以下のスクリプトはテーブルを作成します。下部に「COLLATE latin1_general_cs」と表示されていることに注目してください。最後のcsは大文字と小文字を区別することを意味します。テーブルで大文字と小文字を区別しない場合は、その部分を省略するか、「COLLATE latin1_general_ci」を使用します。

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

独自のテーブルを作成できるプロジェクトの場合は、テーブルを作成するときに大文字と小文字を区別する設定を指定するのが理にかなっています。




2

また、lower_case_table_nameconfigディレクティブを1に設定しない限り、Linuxではテーブル名の大文字と小文字が区別されることに注意してください。これは、テーブルがLinuxでは大文字と小文字を区別するファイルで表されるためです。

特に、大文字と小文字を区別しないWindowsでの開発と、それが存在する本番環境への展開には注意してください。例えば:

"SELECT * from mytable" 

テーブルmyTableに対して、上記のディレクティブが設定されていない限り、Windowsでは成功しますがLinuxでは失敗します。

ここで参照:http : //dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitiveivity.html


1
+1-大文字小文字を区別しないクエリを記述し、Linuxで失敗するというシナリオは、プロジェクトで頻繁に発生しました
Vic

@Vicプロジェクトで同じ問題が発生しています。どのように修正したのですか?
Kamran Ahmed 2014

@KamranAhmed、作成スクリプトに表示されるとおりにテーブル名の大文字と小文字を使用する必要があります
Vic

文字通り大量のクエリを変更する必要があるため、最後の手段となる@Vic。それを行う簡単な方法があるかどうか、私は思っていました。ありがとう!
Kamran Ahmed

@KamranAhmed、lower_case_table_nameコメントの下で指定されているようにを変更してみてください
Vic

1

現在受け入れられているソリューションはほとんどです正しいです。

非バイナリ文字列(CHAR、VARCHAR、TEXT)を使用している場合、比較では大文字と小文字が区別されませ、デフォルトの照合で。

バイナリ文字列(BINARY、VARBINARY、BLOB)を使用している場合、比較では大文字と小文字が区別されるため、以下を使用する必要があります。 LOWERて、他の回答で説明されているようにます。

デフォルトの照合を使用しておらず、非バイナリ文字列を使用している場合、大文字と小文字の区別は選択した照合によって決定されます。

ソース:https : //dev.mysql.com/doc/refman/8.0/en/case-sensitiveivity.html。よく読んでください。他の人は、比較は必然的に大文字と小文字を区別するか区別しないと言うのを誤解しました。これはそうではありません。


0

あなたはそれを試すことができます。お役に立てれば幸いです。

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

バイナリフラグが設定された文字列フィールドでは、常に大文字と小文字が区別されます。バイナリ以外のテキストフィールドの大文字と小文字を区別する検索が必要な場合は、次を使用します。SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.