1. VARCHAR, NVARCHAR

흔히 varchar(n)에 n은 바이트를 나타내고 nvarchar(n)에 n은 글자에 길이를 나타내는 것으로 알고 있었다.

 

하지만 이는 DBMS별로 다르고

MariaDB, Mysql에서는 varchar(n)역시 바이트제한이 아닌 글자의 길이를 나타낸다.

ex) varchar(10)이면 한글 영어 상관없이 10글자까지만 insert 가능하다

 

그럼에도 불구하고 MariaDB에 nvarchar가 존재하는데 그럼 도대체 일반 varchar와 뭐가 다른건지 궁금해서 알아보았다.

 

https://mariadb.com/kb/en/varchar/

마리아디비 문서에서 varchar페이지에 일부분이다.

대충 내용은 이렇다

varchar는 CHARACTER VARYING의 약어이고

nvarchar는 NATIONAL VARCHAR의 약어이다.

NATIONAL VARCHAR는 미리정해진 문자집합을 사용해야하는 varchar이며. mariadb는 utf8을 사용한다고 한다.

 

그럼결국 mariadb에서의 nvarchar는 문자집합 utf8을 사용하는 varchar일 뿐인걸까? 라고 생각하는 찰나 밑에 아예 그 생각이 맞다고 나와있다.

https://mariadb.com/kb/en/varchar/

 

2. utf8, utf8mb4

utf8은 최대 3바이트까지 지원하는데

🎀와 같은 이모지는 이모지당 4바이트를 사용한다.

그래서 데이터베이스에 이모지를 저장하려면 utf8이아닌 utf8mb4문자집합을 사용해야한다.

 

그래서 요즘 새로 만드는 데이터베이스나 테이블들은 기본설정부터 utf8mb4를 주로 사용하게 되는데 아까 nvarchar컬럼은 utf8사용이 강제된다 했으니 이 때 어떻게 될까 궁금해졌고 하는깅메 더불어 이 포스팅 내용 전체를 테스트 해보게 되었다.

 

3. 테스트

CREATE TABLE `abcde` (
  `seq`  INT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
  `test1` VARCHAR(10) NULL,
  `test2` NVARCHAR(10) NULL,
  `test3` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
  `test4` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
  PRIMARY KEY(seq)
) ENGINE=InnoDB;
DEFAULT CHARACTER SET = 'utf8mb4'
DEFAULT COLLATE = 'utf8mb4_general_ci'

따로 컬럼 문자집합을 정하지 않은 varchar와 nvarchar 컬럼 1개씩

특정 문자집합을 각각 utf8mb4, utf8로 정해놓은 varchar 컬럼 1개씩 만들었다.

아마 예상으로는 기본 문자집합이 utf8mb4이므로

test1 - utf8mb4

test2 - utf8

test3 - utf8mb4

test4 - utf8

이렇게 문자집합이 정해질것이다.

 

-- 1번 영어 10자 이하
insert into abcde( test1,test2,test3,test4 )
values( 'abcde', 'abcde', 'abcde', 'abcde' );

-- 2번 한글 10자 이하
insert into abcde( test1,test2,test3,test4 )
values( '테스트중임', '테스트중임', '테스트중임', '테스트중임' );

-- 3번 한글 10자
insert into abcde( test1,test2,test3,test4 )
values( '테스트중임열글자채워', '테스트중임열글자채워', '테스트중임열글자채워', '테스트중임열글자채워' );

-- 4번 이모지
insert into abcde( test1,test2,test3,test4 )
values( '🎀', '🎀', '🎀', '🎀' );

-- 5번 utfmb4에만 이모지
insert into abcde( test1,test3)
values( '🎀', '🎀' );

그리고 다음과 같이 6번에 insert문을 실행해 보았다.

1,2,3번은 문제없이 잘 insert 되었다. 

처음 얘기했던 varchar(n)가 mariadb에서는 바이트가아닌 문자길이임을 알 수 있다.

 

4번 insert문을 실행하면

nvarchar로 정해놓았던 test2번컬럼에서  Incorrect string value라는 에러가 난다. 테이블 기본 문자집합이 utf8mb4지만 nvarchar(n) = varchar(n) CHARACTER SET utf8 이므로 이모지데이터가 insert되지 않는다.

마찬가지로 test4 컬럼에도 insert되지 않는다.

 

5번 utf8mb4 컬럼인 test1, test3번 컬럼에는 이모지가 잘 insert 된다.

 

select
	test1,
    length(test1),
	test2,
    length(test2),
	test3,
    length(test3),
	test4,
    length(test4)
from 
	abcde a;

length()함수는 문자열의 바이트를 나타낸다.

mariadb utf8문자집합은 영문자는 1바이트, 한글은 3바이트, 이모지는 4바이트로 저장함을 볼 수 있다.

 

결론

주로 utf8mb4 문자집합을 사용하는 요즘 mariadb에서 nvarchar컬럼을 사용하면 오히려 해당 컬럼은 utf8문자집합을 사용하게 되므로

nvarchar는 사용할일 이 없어 보인다.

접속하기

 

$ mysql -u root -p

 

먼저 root 계정으로 접속한다.

 

 

 

사용자 확인하기

 

mysql> use mysql;

 

mysql> select host,user from user;

 

 

 

 

사용자 추가하기

 

mysql> create user '사용자'@'localhost(또는 %)' identified by '비밀번호';

 

%는 외부에서의 접근을 허용한다

 

 

 

사용자 삭제하기

 

mysql> drop user '사용자'@'localhost';

 

 

 

 

사용자에게 데이터베이스 권한 부여

 

mysql> grant all privileges on *.* to '사용자'@'localhost';

 

mysql> grant all privileges on DB이름.* to '사용자'@'localhost';

 

mysql> grant all privileges on DB이름.테이블명 to '사용자'@'localhost';

 

mysql> grant select on DB이름.테이블명 to '사용자'@'localhost';

 

mysql> grant update(컬럼1, 컬럼2) on DB이름.테이블명 to '사용자'@'localhost';

 

이렇게 특정 데이터베이스의 권한을 줄 수도 

특정 권한 ex) select 권한만 줄 수도

특정 컬럼에만 update의 권한을 줄 수도 있다.

 

all privieges 는 모든 권한을 

*.*은 모든 데이터베이스의 모든 테이블을 뜻한다.

 

@뒤에 특정 외부 ip를 설정 할 수 있다.

 

 

사용자 생성, 권한 부여 한번에 하기

 

mysql> grant all privileges on *.* to '사용자'@'localhost' identified by '비밀번호';

 

이렇게 한번에 사용자 생성과 권한 부여를 할 수 있다.

 

 

사용자 권한 삭제하기

 

mysql> revoke all on DB이름.* from '사용자'@'localhost';

 

권한 부여와 구조가 같다. 

마찬가지로 응용해서 특정한 조건을 줄 수 있다.

 

 

변경사항 반영하기

mysql> flush privileges;

 

사용자 권한 확인하기

 

mysql> show grants for '사용자명'@'localhost';

 

 

 

  1. 나라고 2019.07.22 22:32

    flush privileges; 마지막에

  2. Kee. 2020.06.27 11:03 신고

    감사합니다 도움이 많이 됐어요!!~

  3. 익명 2021.10.07 19:04

    비밀댓글입니다

+ Recent posts