programing

MySQL: SELECT 문의 대소문자가 구분됩니까?

javaba 2023. 1. 9. 21:29
반응형

MySQL: SELECT 문의 대소문자가 구분됩니까?

MySQL이 이 기능을 사용할 수 있는지SELECT쿼리는 기본적으로 대소문자를 구분하거나 대소문자를 구분하지 않습니다.그렇지 않은 경우 다음과 같은 작업을 수행하려면 어떤 쿼리를 보내야 합니까?

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

실제로, 실제의 장소에서는,ValueIAreSavage.

바이너리 비교를 하지 않는 한 대소문자를 구분하지 않습니다.

값과 전달된 파라미터는 소문자로 입력할 수 있습니다.

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

또 다른 (더 좋은) 방법은COLLATE문서에 기재되어 있는 연산자

컬럼이 다음과 같이 끝나는 조회를 사용하는 경우 비교는 대소문자를 구분하지 않습니다._ci(디폴트 등) latin1_general_ci대조) 및 컬럼이 다음과 같이 끝나는 조회를 사용하는 경우 대소문자를 구분합니다._cs또는_bin(예를 들어utf8_unicode_cs그리고.utf8_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;

이제 대소문자를 구분합니다.

바이너리 사용

이것은 간단한 선택입니다.

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

= 1

바이너리가 포함된 선택 항목입니다.

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

또는

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

= 0

WHERE 문구의 문자열 비교에서는 대소문자가 구분되지 않습니다.다음을 사용하여 비교할 수 있습니다.

WHERE `colname` = 'keyword'

또는

WHERE `colname` = 'KeyWord'

같은 결과를 얻을 수 있습니다.이것이 MySQL의 기본 동작입니다.

대소문자를 구분하려면 다음 항목을 추가할 수 있습니다.COLLATE바로 다음과 같습니다.

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

이 SQL에서는 WHERE와 다른 결과를 얻을 수 있습니다.colnameCOLATE latin1_general_cs = '오류'

latin1_general_cs는 대부분의 데이터베이스에서 공통 또는 기본 조합입니다.

선택한 조합에 따라 대소문자가 구분되는지 여부가 설정됩니다.

기본적으로는 대소문자를 구분하지 않습니다.다음에 가장 중요한 것은 테이블을 작성할 때 대소문자를 구분하여 지정할 수 있기 때문에 테이블 작성 방법을 확인하는 것입니다.

다음 스크립트는 테이블을 만듭니다.하단에 "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;

자체 테이블을 작성할 수 있는 프로젝트인 경우 테이블을 작성할 때 대/소문자를 구분하는 기본 설정을 지정하는 것이 좋습니다.

SQL Select는 대소문자를 구분하지 않습니다.

다음 링크에서는 대소문자를 구분하는 방법을 보여 줍니다.http://web.archive.org/web/20080811231016/http : //sqlserver2000.databases.aspfaq.com:80/how-can-i-make-my-sql-queries-case-sensitive.html

마크 B의 답은 대부분 옳다.

비바이너리 문자열(CHAR, VARCHAR, TEXT)을 사용하는 경우 기본 대조별로 대소문자를 구분하지 않습니다.

문자열(BINARY,하는 구분되므로 는 대소문자를 구분하여 사용할 LOWER른른른

기본 조회를 사용하지 않고 비바이너리 문자열을 사용하는 경우 대소문자의 구분은 선택한 조회에 따라 결정됩니다.

출처 : https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html.자세히 읽다.일부에서는 대소문자를 구분하거나 대소문자를 구분하지 않는다고 잘못 말하고 있습니다.이것은 사실이 아니다.

사용 방법:

order by lower(column_name) asc;

에서는 Linux 를 하지 않는 한합니다.lower_case_table_nameconfig directive를 1로 설정합니다.이는 Linux에서 테이블이 대소문자를 구분하는 파일로 표시되기 때문입니다.

특히 대소문자를 구분하지 않고 실제 가동 환경에 도입할 수 있는 Windows 개발은 주의해야 합니다.예를 들어 다음과 같습니다.

"SELECT * from mytable" 

테이블 myTable은 위의 지시어가 설정되지 않는 한 Windows에서는 성공하지만 Linux에서는 실패합니다.

참조처: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

해봐도 돼.도움이 되길 바랍니다.

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

이진 플래그가 설정된 문자열 필드에서는 항상 대소문자가 구분됩니다.바이너리 이외의 텍스트필드에서 대소문자를 구분하여 검색해야 하는 경우, SELECT 'test' REGEXP BIARNARY 'TEST' AS RESOULD를 사용합니다.

내 경우 BINARY, COLATE, CARTER SET 모두 내 UTF8 테이블에서 작동하지 않습니다.

테이블에는 헨리, 헨리, 수잔, 수잔, susan 등의 사용자 이름이 있으며, 이름의 바이트 시퀀스를 비교하여 각각의 사용자를 찾습니다.

다음 함수는 바이트 시퀀스를 생성합니다.

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

SQL 쿼리는 올바른 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'];
    }
  }
}   

언급URL : https://stackoverflow.com/questions/3936967/mysql-is-a-select-statement-case-sensitive

반응형