상황 설명
이번에 만들고 있는 토이 프로젝트에 PostgreSQL를 처음 써보는데,
설치하고나서 이제 좀 써보려는 찰나에 오류 3가지가 연달아서 발생했다.
- 인코딩 문제 (UHC)
- 출력이 전부 외계어로 나와서 못 읽는 문제 (이게 제일 골치아팠다)
- 유저에 모든 권한을 부여했는데, create가 안 되는 문제
내가 글을 쓰는 건 2번 문제 때문이다
이거 해결하는데만 꼬박 하루를 쏟았고 찾아도 잘 안 나오길래 쓰게 됐다
여러분은 그 고생을 skip할 수 있도록 해결법을 소개해보겠다
우선 문제가 발생하기 된 상황을 살펴보자
프로젝트에 사용할 db 생성 후, 유저에 권한 부여
postgres=# create database ezytutors;
ezytutors 데이터베이스를 생성.
postgres=# grant all privileges on database ezytutors to zzaekkii;
유저 째키한테 ezytutors 데이터베이스에 대한 접근 권한 부여.
테이블 생성 및 테스트 데이터 로드하는 sql 스크립트 제작
/* 테이블이 존재하면 삭제 */
drop table if exists ezy_course_ch4;
/* 테이블 생성 */
create table ezy_course_ch4
(
course_id serial primary key,
tutor_id INT not null,
course_name varchar(140) not null,
posted_time TIMESTAMP default now()
);
/* 테스트용 시드 데이터 로드 */
insert into ezy_course_ch4 (course_id, tutor_id, course_name, posted_time)
values (1, 1, '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술', '2024-08-27 14:09:08');
insert into ezy_course_ch4 (course_id, tutor_id, course_name, posted_time)
values (2, 1, '스프링 DB 1편 - 데이터 접근 핵심 원리', '2024-08-27 14:10:52');
스크립트 실행
psql -U zzaekkii -d ezytutors -f ./src/database.sql
그리고 암호도 잘 입력해줬는데
🚨 첫 오류 발생 - UHC 인코딩 문제
psql:src/database.sql:2: 오류: 0xed 0x85 바이트로 조합된 문자(인코딩: "UHC")와 대응되는 문자 코드가 "UTF8" 인코딩에는 없습
니다
psql:src/database.sql:11: 오류: 0xed 0x85 바이트로 조합된 문자(인코딩: "UHC")와 대응되는 문자 코드가 "UTF8" 인코딩에는 없습
니다
psql:src/database.sql:16: 오류: 0xed 0x85 바이트로 조합된 문자(인코딩: "UHC")와 대응되는 문자 코드가 "UTF8" 인코딩에는 없습
니다
psql:src/database.sql:19: 오류: 0xec 0x8a 바이트로 조합된 문자(인코딩: "UHC")와 대응되는 문자 코드가 "UTF8" 인코딩에는 없습
니다
알았어; 알겠다구
재난 문자 마냥 같은 말이 에러 메시지로 쏟아져 나왔다
뭔 소린지는 몰라도 읽어보면 일단 UHC가 잘못한 것 같다.
UHC인지 BHC인지는 모르겠는데, 일단 UTF8이 착한 애잖아
그럼 이 BHC는 어떻게 해결할 수 있을까?
psql에 postgres로 로그인해서 들어간 다음에
show client_encoding;
로 인코딩이 어떻게 설정돼있나 확인하면 UHC라고 뜨는 게 보일 거다
이걸 UTF8로 바꿔주면 되는데
SET client_encoding = 'UTF8';
이렇게 해결할 수도 있긴 하지만
이걸 입력한 세션동안만 유지돼서, 이 방법은 일회용이라고 볼 수 있다
내가 원하는 건 앞으로도 맘 편하게 쓸 수 있게 세팅하는 거다.
그래서 저건 갖다버리고
환경 변수를 만들어서 PostgreSQL client_encoding이 UTF8이 되도록 만들어주자
일단 제어판-시스템 환경 변수 편집 들어가주고
아래에 있는 '환경 변수'로 들어가준다
그리고 시스템 변수 탭에서 새로 만들기 눌러서
변수 이름은 PGCLIENTENCODING (포스트그리SQL 클라이언트 인코딩 영어로 한거임)
변수 값은 UTF8로 적어주고 만들어주자
그 다음에 새 터미널 켜고 psql 들어가서
show client_encoding;
입력하고 인코딩 형식 뭘로 되있나 한번 확인해보자
이렇게 뜨면 UTF8로 잘 설정된 거
이젠 안 뜨겠군
🤬 두 번째 오류 발생 - ?묎렐 沅뚰븳 ?놁쓬 ?개쒥
psql:src/database.sql:2: ?뚮┝: "ezy_course_ch4" ?뚯씠釉??놁쓬, 臾댁떆??DROP TABLE
psql:src/database.sql:11: ?ㅻ쪟: public ?ㅽ궎留?schema) ?묎렐 沅뚰븳 ?놁쓬
LINE 2: create table ezy_course_ch4
^
psql:src/database.sql:16: ?ㅻ쪟: "ezy_course_ch4" ?대쫫??由대젅?댁뀡(relation)???놁뒿?덈떎
LINE 2: insert into ezy_course_ch4 (course_id, tutor_id, course_name...
^
psql:src/database.sql:19: ?ㅻ쪟: "ezy_course_ch4" ?대쫫??由대젅?댁뀡(relation)???놁뒿?덈떎
LINE 1: insert into ezy_course_ch4 (course_id, tutor_id, course_name...
?묎렐 沅뚰븳 ?놁쓬
흠.. 이건 무슨 말일까 대체
?ㅽ궎留? (욕한 거 아니고 오류 내용임)
생김새를 보면 占쏙옙 사촌정도 되는 인코딩/디코딩 오류인 것 같다.
ezy_course_ch4가 있는 걸로 봐서 스크립트 파일은 잘 읽은 것 같은데
뭔가 오류때문에 문자가 깨져서 메시지가 출력된다.
encoding 문제도 UTF8로 해결해줬는데 도대체 왜..!!
결론부터 말하면 이건 재설치가 답이다
나는 이 오류를 해결하기 위해서 하루하고 반정도 되는 시간을 소비했는데
인터넷에는 나오지 않았다..
그렇게 한참 이것저것 건드려보다가 뭔가 떠올랐다
PostgreSQL 설치할 때, 한글 고려해서 locale 항목을 korea로 설정했었는데
이게 문제인 것 같다는 생각이 들었다 (재설치 2번하고 나서 들었다 제길..!)
설치된 PostgreSQL 16 삭제
일단 제어판-프로그램 추가/제거에서 PostgreSQL 16 제거하고, entire로 전부 제거해준다.
그리고 로컬 C에 들어가서 program files에 있는 PostgreSQL 폴더도 싸그리 삭제해준다.
컴퓨터 재부팅
그리고 컴도 한번 껐다 켜주자
PostgreSQL 16 재설치
공식 홈페이지에서 다운 받은 installer로 다시 설치해준다.
원래대로 쭉쭉 Next 갈겨주다가, Locale 설정하는 부분에서 C를 선택해주자
아무튼 Korea로 설정하지 않으면 된다.
그러고 나면?
🔥 세 번째 오류 발생 - create 권한이 없음
psql:src/database.sql:2: NOTICE: table "ezy_course_ch4" does not exist, skipping DROP TABLE
psql:src/database.sql:11: ERROR: permission denied for schema public
LINE 2: create table ezy_course_ch4
^
psql:src/database.sql:16: ERROR: relation "ezy_course_ch4" does not exist
LINE 2: insert into ezy_course_ch4 (course_id, tutor_id, course_name...
^
psql:src/database.sql:19: ERROR: relation "ezy_course_ch4" does not exist
LINE 1: insert into ezy_course_ch4 (course_id, tutor_id, course_name...
또 무슨 오류야 이건
진정하고 자세히 살펴보니 이건 새 오류는 아니고,
괴문자로 해결해주고 나니 비로소 보이는 진짜 오류다
너가 본체였구나 permission denied?
그래도 locale 문제를 발견하고 해결했다는 이점이 있다.
근데 권한은 아까 다 줬는데 뭐가 문제지?
+2025/02/11 추가
아~~~ 알았다 알았어 그동안 잘못 이해하고 있었다.
지금 문제는 해당 db에 대한 권한이 유저에게 없다는 것이다.
"잉? 이미 줬는데?"라고 생각할 수 있지만 조금 잘못된 부분이 있었다.
1. psql에서 postgres (관리자) 계정으로 접속하고, 해당 db로 이동한다 (명령어 \c db이름)
2. 해당 db내에서 public 스키마에 대한 권한을 원하는 유저에게 부여한다.
그동안 해당 db로 가서 권한을 부여하지 않고,
그냥 psql에서 권한 부여를 하고 있었기 때문에 잉어킹 튀어오르기 마냥 아무일도 일어나지 않았던 것이다.
psql -U postgres -d ezytutors
psql에 해당 db로 postgres 관리자 계정으로 들어가서,
GRANT CREATE PRIVILEGES ON SCHEMA public TO zzaekkii;
# 째키한테 public 스키마에 대한 생성 권한 부여
째키한테 public 스키마에 대해 생성 권한을 부여해주자
psql -U zzaekkii -d ezytutors -f ./src/database.sql
그러고 다시 psql에서 ezytutors db에 접속해 실행하면?
psql:src/database.sql:2: NOTICE: table "ezy_course_ch4" does not exist, skipping
DROP TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
편--안
그래 진작 이랬어야지
그리고 괴문자도 한번 해독해봤다
괴소리 | 뜻 |
?뚮┝ | NOTICE |
?뚯씠釉??놁쓬, 臾댁떆?? | does not exist, skipping |
?ㅻ쪟 | ERROR |
?ㅽ궎留? | for |
?묎렐 沅뚰븳 ?놁쓬 | permission denied |
?대쫫??由대젅?댁뀡 | relation |
???놁뒿?덈떎 | does not exist |
물론 쓸 데는 없다
요약 & 마무리
PostgreSQL을 사용하면서 3가지 오류가 발생했었다.
- UHC 인코딩 문제 -> UTF8 시스템 변수 추가해서 해결.
- ?ㅽ궎留? -> 재설치 후, locale 설정 C로 해서 해결.
- create 권한 없음 -> public 스키마 권한 부여해서 해결.
포스트그레스큐엘,, 넌 냉장고 들어가라~
'Etc.' 카테고리의 다른 글
[도서 리뷰] <행동의 과학, 디자인의 힘> (0) | 2025.02.28 |
---|---|
[오류 해결] 실종된 PostgreSQL 서버 재가동하기 (1) | 2024.08.31 |
[오류 해결] 윈도우 10 블루투스 드라이버가 사라지는 문제 (9) | 2024.07.03 |
[정보처리기사] 응시 자격 서류 온라인 제출하기 (0) | 2024.03.02 |
[Bitcoin Core] 비트코인 코어(testnet) 설치 · 동기화 (Windows) (1) | 2023.10.08 |