por padrão, o MySQL não considera o caso das strings
Isso não é bem verdade. Sempre que você estiver create databaseno MySQL, o banco de dados/esquema terá um conjunto de caracteres e um agrupamento. Cada conjunto de caracteres tem um agrupamento padrão; veja aqui para mais informações.
A ordenação padrão para o conjunto de caracteres latin1, que é latin1_swedish_ci, não diferencia maiúsculas de minúsculas.
Você pode escolher um agrupamento que diferencia maiúsculas de minúsculas, por exemplo latin1_general_cs( gramática do MySQL ):
CREATE SCHEMA IF NOT EXISTS `myschema`
DEFAULT CHARACTER SET latin1
COLLATE latin1_general_cs ;
Isso tem um efeito em coisas como agrupamento e igualdade. Por exemplo,
Em um banco de dados que diferencia maiúsculas de minúsculas, obtemos:
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 |
+----+-------+
Enquanto em um banco de dados que não diferencia maiúsculas de minúsculas, obtemos:
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 |
+----+-------+
Observe que você também pode alterar o agrupamento de dentro de uma consulta . Por exemplo, no banco de dados com distinção entre maiúsculas e minúsculas , posso fazer
Você sempre deve declarar com sua pergunta qual versão do MySQL você está usando, porque o MySQL está em desenvolvimento constante.
Ok, voltando à sua pergunta:
As funções de string no MySQL sempre diferenciam maiúsculas de minúsculas, então você pode usar qualquer uma das funções LOCATE, POSITION, ou INSTR.
Por exemplo:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
A correspondência de padrões com expressão regular ( RLIKEou REGEXP) sempre diferencia maiúsculas de minúsculas para todas as versões do MySQL, exceto a mais nova 3.23.4.
Por exemplo:
SELECT phone FROM user WHERE user_name REGEXP 'term';
Tanto para a comparação normal (=) quanto para a correspondência de padrão SQL ( LIKE), o comportamento depende dos campos envolvidos:
uma. CHAR, VARCHARe todas as variantes de campos TEXT comparam maiúsculas e minúsculas.
b. CHAR BINARY, VARCHAR BINARY
e todas as variantes de campos BLOB comparam maiúsculas e minúsculas.
Se você comparar um campo de (a) com um campo de (b), a comparação fará distinção entre maiúsculas e minúsculas (a distinção entre maiúsculas e minúsculas vence). Veja o capítulo "7.2.7 Tipos de String" do MySQL Reference Manual e procure as instruções sobre ordenação e comparações.
A partir da V3.23.0 também é possível forçar uma comparação entre maiúsculas e minúsculas com o operador cast BINARY, independentemente dos tipos de campos envolvidos. Veja o capítulo "7.3.7 Operadores de conversão" do Manual de Referência do MySQL.
Portanto, você também pode alterar o tipo de user_name ou, com a V3.23.x, tente algo como:
SELECT phone FROM user WHERE BINARY username LIKE '%term%';
Na minha situação, estou usando o Access 2010, mas tive o mesmo problema, mas a solução é diferente: Use a StrComp()função e teste seu retorno para ser zero.
StrComp( thing, 'abc', 0) = 0
Porque StrComp()retorna -1se o primeiro argumento for "menor", 1se for "maior" e 0se for "igual", quando StrComp()=0, você tem uma correspondência que diferencia maiúsculas de minúsculas.
Isso não é bem verdade. Sempre que você estiver
create database
no MySQL, o banco de dados/esquema terá um conjunto de caracteres e um agrupamento. Cada conjunto de caracteres tem um agrupamento padrão; veja aqui para mais informações.A ordenação padrão para o conjunto de caracteres
latin1
, que élatin1_swedish_ci
, não diferencia maiúsculas de minúsculas.Você pode escolher um agrupamento que diferencia maiúsculas de minúsculas, por exemplo
latin1_general_cs
( gramática do MySQL ):Isso tem um efeito em coisas como agrupamento e igualdade. Por exemplo,
Em um banco de dados que diferencia maiúsculas de minúsculas, obtemos:
Enquanto em um banco de dados que não diferencia maiúsculas de minúsculas, obtemos:
Observe que você também pode alterar o agrupamento de dentro de uma consulta . Por exemplo, no banco de dados com distinção entre maiúsculas e minúsculas , posso fazer
Você sempre deve declarar com sua pergunta qual versão do MySQL você está usando, porque o MySQL está em desenvolvimento constante.
Ok, voltando à sua pergunta:
As funções de string no MySQL sempre diferenciam maiúsculas de minúsculas, então você pode usar qualquer uma das funções
LOCATE
,POSITION
, ouINSTR
.Por exemplo:
A correspondência de padrões com expressão regular (
RLIKE
ouREGEXP
) sempre diferencia maiúsculas de minúsculas para todas as versões do MySQL, exceto a mais nova 3.23.4.Por exemplo:
Tanto para a comparação normal (=) quanto para a correspondência de padrão SQL (
LIKE
), o comportamento depende dos campos envolvidos:uma.
CHAR
,VARCHAR
e todas as variantes de campos TEXT comparam maiúsculas e minúsculas.b.
CHAR BINARY
,VARCHAR BINARY
e todas as variantes de campos BLOB comparam maiúsculas e minúsculas.Se você comparar um campo de (a) com um campo de (b), a comparação fará distinção entre maiúsculas e minúsculas (a distinção entre maiúsculas e minúsculas vence). Veja o capítulo "7.2.7 Tipos de String" do MySQL Reference Manual e procure as instruções sobre ordenação e comparações.
A partir da V3.23.0 também é possível forçar uma comparação entre maiúsculas e minúsculas com o operador cast
BINARY
, independentemente dos tipos de campos envolvidos. Veja o capítulo "7.3.7 Operadores de conversão" do Manual de Referência do MySQL.Portanto, você também pode alterar o tipo de user_name ou, com a V3.23.x, tente algo como:
Isso funcionará no MySQL, independentemente do conjunto de caracteres.
Colocar
'BINARY'
força uma comparação binária.Na minha situação, estou usando o Access 2010, mas tive o mesmo problema, mas a solução é diferente: Use a
StrComp()
função e teste seu retorno para ser zero.StrComp( thing, 'abc', 0) = 0
Porque
StrComp()
retorna-1
se o primeiro argumento for "menor",1
se for "maior" e0
se for "igual", quandoStrComp()=0
, você tem uma correspondência que diferencia maiúsculas de minúsculas.Veja aqui , aqui ou aqui .
Tente isso para pesquisa insensível, funciona bem com ótimo desempenho: