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 코드/a
97이고z
122 입니다.따라서 첫 번째 문자의 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 코드/A
65세이고Z
90입니다. 그래서 첫 번째 문자의 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 Select Query - 값의 처음 10자만 가져옵니다.
언급URL : https://stackoverflow.com/questions/53063532/mysql-select-where-first-character-is-lowercase-or-uppercase
'programing' 카테고리의 다른 글
Java에서 문자열 배열을 문자열로 변환 (0) | 2023.01.20 |
---|---|
MySQL에서 false를 기본값으로 사용하여 부울 열을 생성하시겠습니까? (0) | 2023.01.10 |
n번째 문자마다 문자열 분할 (0) | 2023.01.10 |
창을 다시 활성화하고 있습니다.Chrome 경고 (0) | 2023.01.10 |
MySQL의 5번째 백분위수(MariaDB) (0) | 2023.01.10 |