MySQL 테이블이 생성된 후 이상하게 사라졌나요? 너비가 0인 문자 트랩 발견

너비가 0인 문자 트랩을 해결하고 데이터베이스를 더 이상 "괴롭히지" 않게 만드는 방법을 알려주는 세 가지 팁입니다.

저자: Aikesheng의 DBA 팀 멤버인 Qin Fulang은 일상적인 프로젝트 문제와 회사 플랫폼 문제 해결을 담당하고 있습니다. 인터넷을 사랑하고 사진도 알고 요리실력도 아는 DBA는 운전을 잘 못하는 디디~

Aikeson 오픈 소스 커뮤니티에서 제작된 원본 콘텐츠는 승인 없이 사용할 수 없습니다. 편집자에게 연락하여 재인쇄할 출처를 명시해 주세요.

이 글은 1,000단어 정도이며 읽는 데 3분 정도 소요될 것으로 예상됩니다.

소개

MySQL을 사용하는 과정에서 가끔 작은 문자 하나가 큰 문제를 일으킬 수 있습니다. 사실을 발견하기 전에는 문제가 유령에 의해 발생한다고 생각했습니다. 그러나 사실을 발견했을 때 단일 문자에 의한 것이라고는 예상하지 못했습니다. 문제는 너비가 0인 문자가 IT 산업 전반에 숨어 있는 유령과 같다는 점입니다. 오늘은 MySQL에서 반복적으로 발생하는 "테이블 사라지기" 사례를 공유하겠습니다.

문제 설명

test명명된 테이블은 어떤 수단(예: 명령줄 또는 데이터베이스 개발 도구 등)을 통해 데이터베이스 에 생성됩니다 lang. 테이블 구조는 다음과 같습니다.

CREATE TABLE `lang​` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SHOW TABLES;명령을 통해 이 테이블의 존재를 확인할 수 있습니다.

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a1             |
| lang​          |
| t1             |
| z1             |
+----------------+
4 rows in set (0.00 sec)

SELECT * FROM lang;그러나 테이블에 연결하기 위해 MySQL 클라이언트에서 쿼리나 비즈니스 프로그램을 실행하려고 하면 다음 과 같은 오류 메시지가 나타납니다.

mysql> select * from lang;
ERROR 1146 (42S02): Table 'test.lang' doesn't exist

시계가 마술처럼 사라졌습니다.

원인 분석

마치 유령을 본 것과 같습니다. 쿼리 구문을 수동으로 여러 번 입력해도 이 테이블은 쿼리할 수 없습니다. 테이블 생성 문을 Sublime Text 텍스트 도구에 복사합니다.

이때 우리는 문제를 발견했습니다: 테이블 이름 뒤에 "<0×200b>" 문자가 따라옵니다. 너비가 0인 공백으로 너비가 0인 문자의 일종입니다.

너비가 0인 문자란 무엇입니까?

너비가 0인 문자는 표시되는 공간을 차지하지 않으므로 대부분의 상황에서 표시되지 않는 특수 유니코드 문자입니다. 그러나 텍스트로 존재할 수 있으며 데이터베이스 관리 시스템을 포함한 컴퓨터 프로그램에 영향을 미칠 수 있습니다. 유니코드에서 U+200B는 너비가 0인 공백을 나타내며 줄 바꿈이 필요할 수 있는 경우에 자주 사용됩니다. 또한 너비가 0인 다른 문자도 있으므로 여기서는 설명하지 않습니다.

그렇다면 이런 유령 같은 캐릭터는 왜 존재하는 걸까요? 소위 존재는 합리적임을 의미합니다. 너비가 0인 문자는 데이터 크롤링 방지, 암호화된 정보 전송 및 민감한 단어 검색 방지와 같은 시나리오에 자주 사용됩니다. 하지만 데이터베이스 시스템에서 사용하다 보면 가끔 머리가 아픈 경우가 있는데, 이 글에서 언급한 것도 그 중 하나이다. 이러한 문자는 공간을 차지하지 않지만 SQL 명령의 올바른 구조를 파괴하고 이후 사용 시 오류를 일으킬 수 있습니다.

어떻게 해결하나요?

  1. 테이블을 생성하기 전에 테이블 생성문을 여러 텍스트 편집 도구에 복사하여 비정상적인 기호 프롬프트가 있는지 확인합니다. (일반 텍스트 도구에서는 너비가 0인 문자를 표시하지 못할 수 있습니다.) Sublime Text 및 Visual Studio Code와 같은 도구나 플러그인을 사용해 본 후에는 너비가 0인 문자를 상기시키는 기능이 있으며 유니코드 문자를 볼 수 있는 온라인 웹 도구도 있습니다. 너비가 0인 문자를 표시할 수 있는 다른 도구를 알고 계시다면 댓글 영역에 메시지를 남겨 공유해주세요.
  2. 테이블을 생성한 후 SHOW CREATE TABLE;명령어를 이용하여 테이블 구조를 확인한 후, 출력된 내용을 위의 텍스트 편집 도구에 복사하여 비정상적인 기호가 있는지 확인합니다.
  3. SHOW TABLES;많은 테스트 끝에 MySQL 클라이언트에서 명령을 실행할 때 너비가 0인 공백이 포함된 테이블 이름 뒤의 경계선 "|"이 다른 줄과 정렬되지 않은 것으로 나타났습니다 . 이를 통해 문제가 있는 테이블을 빠르게 검색할 수 있지만 특정 문자는 표시되지 않습니다. 물론 이 방법은 일반적으로 타사 개발 도구, 비즈니스 프로그램 등에 적용되지 않습니다.

요약하다

너비가 0인 문자는 MySQL을 사용하는 동안 해결 불가능해 보이는 문제를 일으킬 수 있는 보이지 않는 함정입니다. 특성을 이해하고, SQL 명령을 다시 확인하고, 신뢰할 수 없는 소스에서 복사 및 붙여넣기를 피하고, 적절한 도구를 사용하고, 모범 사례를 따르면 데이터베이스가 원활하게 실행되고 유사한 문제가 발생하지 않도록 할 수 있습니다.

더 많은 기술 기사를 보려면 https://opensource.actionsky.com/을 방문하세요.

SQLE 소개

SQLE는 개발부터 프로덕션 환경까지 SQL 감사 및 관리를 포괄하는 포괄적인 SQL 품질 관리 플랫폼입니다. 주류 오픈소스, 상용 및 국내 데이터베이스를 지원하고 개발, 운영 및 유지 관리를 위한 프로세스 자동화 기능을 제공하고 온라인 효율성을 향상시키며 데이터 품질을 향상시킵니다.

SQLE 가져오기

유형 주소
저장소 https://github.com/actiontech/sqle
문서 https://actiontech.github.io/sqle-docs/
출시 소식 https://github.com/actiontech/sqle/releases
데이터 감사 플러그인 개발 문서 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
Linus는 커널 개발자가 탭을 공백으로 대체하는 것을 막기 위해 스스로 노력했습니다. 그의 아버지는 코드를 작성할 수 있는 몇 안되는 리더 중 한 명이고, 둘째 아들은 오픈 소스 기술 부서의 책임자이며, 막내 아들은 오픈 소스 코어입니다. 기고자 Robin Li: 자연 언어 새로운 범용 프로그래밍 언어가 될 것입니다. 오픈 소스 모델은 Huawei에 비해 점점 더 뒤쳐질 것입니다 . 일반적으로 사용되는 5,000개의 모바일 애플리케이션을 Hongmeng으로 완전히 마이그레이션하는 데 1년이 걸릴 것입니다. 타사 취약점. 기능, 안정성 및 개발자의 경험이 크게 개선된 Quill 2.0 출시되었습니다. Ma Huateng과 Zhou Hongyi는 "원한을 제거하기 위해" 공식적으로 출시되었습니다. Laoxiangji의 소스는 코드가 아닙니다. Google이 대규모 구조 조정을 발표한 이유는 매우 훈훈합니다.
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/actiontechoss/blog/11053596