MySQL SELECT
쿼리가 대소 문자를 구분하는지 아니면 대소 문자를 구분하지 않는지 누구나 말해 줄 수 있습니까 ? 그렇지 않은 경우 다음과 같은 작업을 수행하기 위해 어떤 쿼리를 보내야합니까?
SELECT * FROM `table` WHERE `Value` = "iaresavage"
실제로 실제 값은 Value
입니다 IAreSavage
.
'value' in ('val1', 'val2', 'val3')
MySQL SELECT
쿼리가 대소 문자를 구분하는지 아니면 대소 문자를 구분하지 않는지 누구나 말해 줄 수 있습니까 ? 그렇지 않은 경우 다음과 같은 작업을 수행하기 위해 어떤 쿼리를 보내야합니까?
SELECT * FROM `table` WHERE `Value` = "iaresavage"
실제로 실제 값은 Value
입니다 IAreSavage
.
'value' in ('val1', 'val2', 'val3')
답변:
그들은있는 경우를 구분 하면 않는 한, 이진 비교를 .
값과 전달 된 매개 변수를 소문자로 지정할 수 있습니다.
SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")
또 다른 (더 나은) 방법은 문서에서COLLATE
말한 것처럼 연산자 를 사용하는 것입니다
SELECT
문장은 COLLATE
그때 어떻게 사용 됩니까?
LOWER()
또는 임의의 COLLATE
절 과 같은 문자열 변환을 사용 하면 인덱스를 완전히 무시할 수 있으며 시간이 지남에 따라 테이블이 커짐에 따라 성능에 심각한 영향을 줄 수 있습니다. 아마 당신이 찾고있는 사용자 이름입니까? 대소 문자를 구분하지 않는 데이터 정렬을 사용하고 열에 고유 인덱스를 추가하십시오. 사용 EXPLAIN
인덱스가 사용되고 있음을 확인합니다.
이진 사용
이것은 간단한 선택입니다
SELECT * FROM myTable WHERE 'something' = 'Something'
= 1
이진으로 선택입니다
SELECT * FROM myTable WHERE BINARY 'something' = 'Something'
또는
SELECT * FROM myTable WHERE 'something' = BINARY 'Something'
= 0
비교는 다음 의 경우를 구분 열이 끝나는 정렬을 사용하는 경우 _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;
비교는 대소 문자를 구분해야합니다.
WHERE 문구의 문자열 비교는 대소 문자를 구분하지 않습니다. 당신은을 사용하여 비교하려고 할 수 있습니다
WHERE `colname` = 'keyword'
또는
WHERE `colname` = 'KeyWord'
그리고 당신은 같은 결과 를 얻을 것이다 . 이것이 MySQL의 기본 동작입니다.
비교를 대소 문자를 구분 하려면 다음 COLLATE
과 같이 추가 하십시오.
WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'
그 SQL은 다음과 같이 다른 결과를 줄 것입니다 : WHERE colname
COLLATE latin1_general_cs = 'keyword'
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
또한 lower_case_table_name
config 지시문을 1로 설정하지 않으면 Linux에서 테이블 이름은 대소 문자를 구분합니다 . Linux에서 대소 문자를 구분하는 파일로 테이블이 표시되기 때문입니다.
특히 대소 문자를 구분하지 않고 프로덕션 환경에 배포하는 Windows 개발에주의하십시오. 예를 들면 다음과 같습니다.
"SELECT * from mytable"
위에서 언급 한 지시문이 설정되어 있지 않으면 myTable에 대해 myTable은 Windows에서는 성공하지만 Linux에서는 다시 실패합니다.
여기를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html
lower_case_table_name
우리가 아래에 언급 한 답변에 지정된대로 변경하십시오
현재 허용되는 솔루션은 대부분 정확합니다.
이진이 아닌 문자열 (CHAR, VARCHAR, TEXT)을 사용하는 경우 기본 데이터 정렬에 따라 대소 문자를 구분하지 않고 비교 합니다.
이진 문자열 (BINARY, VARBINARY, BLOB)을 사용하는 경우 비교는 대소 문자를 구분하므로 LOWER
다른 답변에 설명 된대로 사용해야 합니다.
기본 데이터 정렬을 사용하지 않고 이진이 아닌 문자열을 사용하는 경우 대소 문자 구분은 선택한 데이터 정렬에 의해 결정됩니다.
출처 : https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html . 자세히 읽으십시오. 어떤 사람들은 비교가 대소 문자를 구분하거나 대소 문자를 구분하지 않는다고 잘못 생각했습니다. 그렇지 않다.
이진 플래그가 설정된 문자열 필드는 항상 대소 문자를 구분합니다. 이진이 아닌 텍스트 필드를 대 / 소문자를 구분하여 검색해야하는 경우 다음을 사용하십시오. SELECT 'test'REGEXP BINARY 'TEST'AS RESULT;