programing

MySQL - 첫 번째 문자가 소문자 또는 대문자일 경우 선택합니다.

sourcetip 2023. 1. 10. 21:49
반응형

MySQL - 첫 번째 문자가 소문자 또는 대문자일 경우 선택합니다.

이전에 물어본 내용이라면 죄송합니다만, 답변을 찾을 수 없습니다.MySQL select 문을 생성하여 데이터베이스에서 첫 번째 문자가 소문자 또는 대문자인 모든 문자열을 선택하려면 어떻게 해야 합니까?

보통 영어 Word 데이터베이스에서 길이가 8자를 초과하는 단어를 무작위로 10개 선택할 때 다음과 같은 방법을 사용합니다.

SELECT word FROM en_dictionary WHERE CHAR_LENGTH(word)>8 ORDER BY RAND() LIMIT 10

아쉽게도 결과에서 원하지 않는 단어는 대개 도시 이름, 종 등의 용어이기 때문에 대문자로 선택됩니다.

여기에 이미지 설명 입력

그래서 질문입니다.소문자 알파벳(또는 대문자)으로 시작하는 단어만 선택할 수 있는 방법이 있을까요?

이런 것도 할 수 있고, 먹히겠지만, 아주 추악한 말이 될 거야.

AND word LIKE BINARY 'a%' AND word LIKE BINARY 'b%' AND word LIKE BINARY 'c%'...

기능을 사용할 수 있습니다.입력 문자열의 맨 왼쪽 문자의 숫자 값을 반환합니다.

소문자 첫 글자의 경우: ASCII 코드/a97이고z122 입니다.따라서 첫 번째 문자의 ASCII 코드는 97에서 122 사이여야 합니다.

SELECT word 
FROM en_dictionary 
WHERE CHAR_LENGTH(word) > 8 
  AND ASCII(word) BETWEEN 97 AND 122
ORDER BY RAND() LIMIT 10

대문자 첫 글자의 경우: ASCII 코드/A65세이고Z90입니다. 그래서 첫 번째 문자의 ASCII 코드는 65에서 90 사이여야 합니다.

SELECT word 
FROM en_dictionary 
WHERE CHAR_LENGTH(word) > 8 
  AND ASCII(word) BETWEEN 65 AND 90
ORDER BY RAND() LIMIT 10

완전한 답변은 아니지만, 코멘트가 너무 커서 대답을 했습니다.

대소문자를 구분하는 utf8을 사용하는 것이 좋습니다.utf8_bin.
그러면 BINARY나 다른 MySQL "핵"을 사용하여 필요한 결과를 얻을 필요가 없습니다. LIKE/BEWN을 사용하면 문제 없이 대소문자를 구분하여 사용할 수 있습니다.

테이블 작성

CREATE TABLE test (

    utf8_general_ci_word VARCHAR(255) COLLATE utf8_general_ci
  , utf8_bin_word VARCHAR(255) COLLATE utf8_bin
);

INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('a', 'a');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('A', 'A');

INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('b', 'b');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('B', 'B');

결과.

쿼리 #1

    SELECT 
     utf8_general_ci_word
    FROM
     test 
    WHERE
     utf8_general_ci_word LIKE 'a%'

    ;

| utf8_general_ci_word |
| -------------------- |
| a                    |
| A                    |

쿼리 #2

    SELECT 
     utf8_general_ci_word
    FROM
     test 
    WHERE
     utf8_general_ci_word LIKE BINARY 'a%'

    ;

| utf8_general_ci_word |
| -------------------- |
| a                    |

쿼리 #3

    SELECT 
     utf8_bin_word
    FROM
     test 
    WHERE
     utf8_bin_word LIKE 'a%';

| utf8_bin_word |
| ------------- |
| a             |

데모

그래서 당신의 질문은 다음과 같습니다.

쿼리

SELECT
  word
FROM
  en_dictionary
WHERE
    CHAR_LENGTH(word) > 8
  AND
    word BETWEEN 'a' AND 'z'
ORDER BY
 RAND()
LIMIT 10

테스트 데이터에 대한 데모

2019년 8월 11일 편집

<= 'z'가 아니므로 'zahn'과 같은 단어가 누락됩니다. 대신 'zzzzz'를 사용하십시오.

dnoeth의 코멘트와2019년 7월 11일에 있었던 매우 늦은 스파링 세션 덕분에 실제로 위의 SQL에 버그가 있는 경우가 있습니다.

~하듯이word BETWEEN 'a' AND 'z'의 구문설탕입니다.word >= 'a' AND word <= 'z'이것은 정말로 그 이상의 단어와 일치하지 않을 것이다z맘에 들다zahn또는zzzzzzzzz그 점에 관해서는위의 쿼리에 유효한 패치는 다음과 같습니다.REPEAT('<char>', <number_of_size_of_table_column_datatype>)이 경우 최대 범위 의미로서word BETWEEN 'a' AND REPEAT('z', 255)

패치의 데모..

서브스트링과 REGEXP 바이너리를 사용할 수 있습니다.

SELECT word 
FROM en_dictionary 
WHERE CHAR_LENGTH(word)>8 
AND SUBSTRING(word, 1, 1) REGEXP BINARY '[A-Z]'
ORDER BY RAND() LIMIT 10

REGEXP 바이너리에서는, 임의의 regex 를 사용할 수 있습니다.https://dev.mysql.com/doc/refman/8.0/en/regexp.html 를 참조해 주세요.

서브스트링은 단순히 첫 글자를 얻기 위한 것입니다.

MySQL에서 대문자를 확인하는 방법

MySQL Select Query - 값의 처음 10자만 가져옵니다.

언급URL : https://stackoverflow.com/questions/53063532/mysql-select-where-first-character-is-lowercase-or-uppercase

반응형