programing

MySQL Server 버전 10.3.9-MariaDB에서 텍스트에 따옴표가 하나 있는 경우 쿼리할 수 없음

minimums 2023. 8. 11. 21:38
반응형

MySQL Server 버전 10.3.9-MariaDB에서 텍스트에 따옴표가 하나 있는 경우 쿼리할 수 없음

값이 ~!인 TagName 파일이 있는 MySQL 데이터베이스가 있습니다.@#$%^&*()_+|}{":?></';[]\=-' 태그 정보에서 태그 이름을 선택하는 쿼리를 시도합니다. 여기서 태그 이름은 '%@#$%'와 같습니다.

태그 이름에 따옴표 문자가 포함된 데이터가 표시됩니다.하지만 저는 = 연산자 및 좋아요 연산자에 쿼리하고 "를 추가하여 하나의 견적을 수락하지만 결과가 비어 있습니다.

또한 COLATE UTF8_GENERAL_CI를 추가하거나 CARRATE SET을 변경하려고 하지만 모두 성공하지 못했습니다.

SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';
SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%' COLLATE UTF8_GENERAL_CI;
SELECT * from taginfo where tagname COLLATE UTF8_GENERAL_CI like '%~!@#$%^&*()_+|}{":?><./'';[]\=-`%';

ALTER TABLE mytable CONVERT TO CHARACTER SET UTF8_GENERAL_CI
Error   2/19/2019 10:03:24 AM   0:00:00.039 <link> - MySQL Database Error: Unknown character set: 'UTF8_GENERAL_CI' 5   0

DB 서버 버전:MySQL 5.5.5 MariaDB 테이블 정보:

다음은 단일 따옴표가 없는 결과 쿼리입니다.

업데이트됨:문자 없이 쿼리하면 \ 결과가 표시되는 문제를 발견했습니다.

select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]%';

그러나 마지막에 \"라는 문자를 추가했습니다. 아무 것도 표시되지 않습니다.

select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\%';

여전히 작동하지 않는 스플래시를 더 추가합니다.

select TagName from taginfo where TagName like '%~!@#$%^&*()_+|}{":?><./'';[]\\%';

업데이트됨:지금 문제는 유사한 쿼리 결과가 반환되지만 = 쿼리는 아무 결과도 반환하지 않습니다.

SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\\=-`%';
select * from taginfo where TagName =     '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

업데이트됨:MySQL 8.0.13에서 DB를 작성하려고 하면 이 쿼리가 잘 작동하고 1행을 반환합니다.

select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';

그러나 10.3.9-MariaDB에서 쿼리는

select * from taginfo1 where TagName = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`';

결과를 반환할 수 없습니다.

SELECT VERSION();

10.3.9-마리아DB

결국 이 모드를 설정했기 때문에 문제를 발견했습니다.

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

그리고 이 쿼리는 비어 있습니다.

select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

NO_BACKSLASH_ESCAPES를 제거할 때SET @@SQL_MODE = 'NO_ENGINE_SUBSTITUTION';

select * from taginfo where tagname = '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'

tagname = ~!@#$%^&*()_+|}{:?><./';[]\=-`

설정하려고 합니다.

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_BACKSLASH_ESCAPES');

그리고 업데이트 쿼리 이중 추가 \

SELECT * from taginfo where tagname like '%~!@#$%^&*()_+|}{":?><./'';[]\\=-`%';

이 쿼리는 올바른 결과를 반환하지만 = 운영자와는 작동하지 않습니다.

DROP TABLE IF EXISTS `taginfo`;

CREATE TABLE `taginfo` (
    `tagname` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

-- Notice single quote and backslash are escaped:
INSERT INTO `taginfo` (`tagname`) VALUES   ('~!@#$%^&*()_+|}{":?><./'';[]\\=-`'); 
SELECT * FROM `taginfo` WHERE tagname =     '~!@#$%^&*()_+|}{":?><./'';[]\\=-`'; 

-- Notice single quote, percent and underscore are escaped and backslash escaped twice
SELECT * FROM `taginfo` WHERE tagname LIKE  '~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`';
SELECT * FROM `taginfo` WHERE tagname LIKE '%~!@#$\%^&*()\_+|}{":?><./'';[]\\\\=-`%';

백슬래시는 MySQL의 이스케이프 문자입니다.당신은 그것을 이중으로 탈출해야 할 것입니다, 마치.\\또한, 사용하는 경우LIKE조건, 백분율 기호 및 밑줄도 이스케이프해야 합니다(관련이 없는 값과 일치하는 경우).

전달할 값을 선택하기만 하면 현재 상황을 확인할 수 있습니다.

SELECT '%~!@#$\%^&*()_+|}{":?><./'';[]\=-`%' test1;

| test1                            |
| -------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]=-`% |

백슬래시 하나가 사라집니다.MySQL은 무언가를 탈출하기 위해 존재한다고 생각하지만, 다음 캐릭터 이후로 (=)는 사실 특별한 캐릭터가 아닙니다. 더 이상의 일은 일어나지 않습니다.

이제 백슬래시를 두 번 탈출해 보겠습니다. 그러면 출력에 표시됩니다.

SELECT '%~!@#$\%^&*()\_+|}{":?><./'';[]\\=-`%' test2;

| test2                             |
| --------------------------------- |
| %~!@#$%^&*()_+|}{":?><./';[]\=-`% |

DB Fiddle에서 보기

언급URL : https://stackoverflow.com/questions/54757549/mysql-server-version-10-3-9-mariadb-can-not-query-text-has-single-quote

반응형