AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 15250
Accepted
Somnath Muluk
Somnath Muluk
Asked: 2012-03-20 03:25:02 +0800 CST2012-03-20 03:25:02 +0800 CST 2012-03-20 03:25:02 +0800 CST

Como fazer uma pesquisa sensível a maiúsculas e minúsculas na cláusula WHERE?

  • 772

Eu quero pesquisa com distinção entre maiúsculas e minúsculas na consulta SQL. Mas por padrão, o MySQL não considera o caso das strings.

Alguma idéia de como fazer uma pesquisa com distinção entre maiúsculas e minúsculas na consulta SQL?

mysql select
  • 5 5 respostas
  • 117862 Views

5 respostas

  • Voted
  1. Best Answer
    Matt Fenwick
    2012-03-20T06:59:11+08:002012-03-20T06:59:11+08:00

    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,

    create table casetable (
      id int primary key, 
      thing varchar(50)
    );
    
    select * from casetable;
    +----+-------+
    | id | thing |
    +----+-------+
    |  3 | abc   |
    |  4 | ABC   |
    |  5 | aBc   |
    |  6 | abC   |
    +----+-------+
    

    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

    select * from casetable where thing collate latin1_swedish_ci = "abc";
    +----+-------+
    | id | thing |
    +----+-------+
    |  3 | abc   |
    |  4 | ABC   |
    |  5 | aBc   |
    |  6 | abC   |
    +----+-------+
    
    • 24
  2. Turgut
    2012-03-20T04:11:10+08:002012-03-20T04:11:10+08:00

    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%';
    
    • 16
  3. user2288580
    2019-08-24T05:15:51+08:002019-08-24T05:15:51+08:00

    Isso funcionará no MySQL, independentemente do conjunto de caracteres.

    SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;
    

    Colocar 'BINARY'força uma comparação binária.

    • 5
  4. Martin F
    2015-05-29T14:48:39+08:002015-05-29T14:48:39+08:00

    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.

    Veja aqui , aqui ou aqui .

    • 1
  5. ganji
    2016-01-10T07:32:24+08:002016-01-10T07:32:24+08:00

    Tente isso para pesquisa insensível, funciona bem com ótimo desempenho:

    "SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
    
    • -1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve