MySQL: is a SELECT statement case sensitive?

300

Can anyone tell me if a MySQLSELECT query is case sensitive or case insensitive by default? And if not, what query would I have to send so that I can do something like:

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

Where in actuality, the real value ofValue isIAreSavage.

105

Answer

Solution:

They are case insensitive, unless you do a binary comparison.

748

Answer

Solution:

You can lowercase the value and the passed parameter :

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

Another (better) way would be to use theCOLLATE operator as said in the documentation

71

Answer

Solution:

Comparisons are case insensitive when the column uses a collation which ends with (such as the defaultlatin1_general collation) and they are case sensitive when the column uses a collation which ends with{-code-3} or{-code-4} (such as theutf8_unicode{-code-3} andutf8{-code-4} collations).

Check collation

You can check your server, database and connection collations using:

mysql> show variables like '%collation%';
+     
Write your answer






152
votes

Answer

--+
Write your answer




671
votes

Answer

---------+ | Variable_name | Value | +
Write your answer






911
votes

Answer

--+
Write your answer




76
votes

Answer

---------+ | collation_connection | utf8_general | | collation_database | latin1_swedish | | collation_server | latin1_swedish | +
Write your answer






605
votes

Answer

--+
Write your answer




421
votes

Answer

---------+

and you can check your table collation using:

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+     
Write your answer






686
votes

Answer

--+
Write your answer




668
votes

Answer

--+
Write your answer




472
votes

Answer

---------+ | table_schema | table_name | table_collation | +
Write your answer






183
votes

Answer

--+
Write your answer




216
votes

Answer

--+
Write your answer




565
votes

Answer

---------+ | myschema | mytable | latin1_swedish_ci |

Change collation

You can change your database, table, or column collation to something case sensitive as follows:

-- 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;

Your comparisons should now be case-sensitive.

666

Answer

--+
175

Answer

---------+ | Variable_name | Value | +
996

Answer

--+
254

Answer

---------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +
884

Answer

--+
524

Answer

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

Answer

--+
842

Answer

--+
881

Answer

---------+ | table_schema | table_name | table_collation | +
351

Answer

--+
3

Answer

--+
321

Answer

---------+ | 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;
825

Answer

Solution:

USE BINARY

This is a simple select

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

= 1

This is a select with binary

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

or

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

= 0

394

Answer

Solution:

String comparison in WHERE phrase is not case sensitive. You could try to compare using

WHERE `colname` = 'keyword'

or

WHERE `colname` = 'KeyWord'

and you will get the same result. That is default behavior of MySQL.

If you want the comparison to be case sensitive, you could addCOLLATE just like this:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

That SQL would give different result with this one: WHEREcolname COLLATE latin1_general_cs = 'keyword'

latin1_general_cs is common or default collation in most database.

664

Answer

Solution:

The collation you pick sets whether you are case sensitive or not.

894

Answer

Solution:

The default is case insensitive, but the next most important thing you should take a look at is how the table was created in the first place, because you can specify case sensitivity when you create the table.

The script below creates a table. Notice down at the bottom it says "COLLATE latin1_general_cs". That cs at the end means case sensitive. If you wanted your table to be case insensitive you would either leave that part out or use "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;

If your project is such that you can create your own table, then it makes sense to specify your case sensitivity preference when you create the table.

393

Answer

Solution:

SQL Select is not case sensitive.

This link can show you how to make is case sensitive: http://web.archive.org/web/20080811231016/http://sqlserver2000.databases.aspfaq.com:80/how-can-i-make-my-sql-queries-case-sensitive.html

341

Answer

Solution:

Marc B's answer is mostly correct.

If you are using a nonbinary string (CHAR, VARCHAR, TEXT), comparisons are case-insensitive, per the default collation.

If you are using a binary string (BINARY, VARBINARY, BLOB), comparisons are case-sensitive, so you'll need to useLOWER as described in other answers.

If you are not using the default collation and you are using a nonbinary string, case sensitivity is decided by the chosen collation.

Source: https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html. Read closely. Some others have mistaken it to say that comparisons are necessarily case-sensitive or insensitive. This is not the case.

996

Answer

Solution:

Try with:

order by lower(column_name) asc;
192

Answer

Solution:

Note also that table names are case sensitive on Linux unless you set thelower_case_table_name config directive to 1. This is because tables are represented by files which are case sensitive in Linux.

Especially beware of development on Windows which is not case sensitive and deploying to production where it is. For example:

"SELECT * from mytable" 

against table myTable will succeed in Windows but fail in Linux, again, unless the abovementioned directive is set.

Reference here: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

698

Answer

Solution:

You can try it. hope it will be useful.

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

Answer

Solution:

String fields with the binary flag set will always be case sensitive. Should you need a case sensitive search for a non binary text field use this: SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

101

Answer

Solution:

In my case neither BINARY nor COLLATE nor CHARACTER SET works with my UTF8 table.

I have usernames in my table like henry, Henry, susan, Susan or suSan and find the respective users by comparing the byte sequences of the names.

The following function creates the byte sequences:

function makeByteString($string){
    $tmp = "";
    for($i=0;$i<strlen($string);$i++){
        $sign = substr($string,$i,1);
        $tmp.=ord($sign);
    }
    return $tmp;
}

The SQL query finds the correct id:

$sql = "SELECT id, username FROM users WHERE `username` = ? ";
$stmt = $conn->prepare($sql);
$stmt->execute([$strUsername]); //e.g. susan, Susan or suSan
$rows = $stmt->rowCount();
if($stmt && $rows>0){
  while ($row = $stmt->fetch()) {
    if(makeByteString($strUsername) == 
                   makeByteString(trim($row["username"]))){
      $id = $row['id'];
    }
  }
}   

People are also looking for solutions to the problem: javascript - content hide after data reload with ajax

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.