Mysql 특수문자 넣기 - mysql teugsumunja neohgi

SELECT

concat(concat(SUBSTR(USER_NAME,1,1),'*'),SUBSTR (USER_NAME,3,10) )

FORM

해당 쿼리는 이름사이에 별표를 넣어야 할때 사용하는 쿼리문이다.

concat(SUBSTR(USER_NAME,1,1),'*')

-SUBSTR(USER_NAME,1,1) 

SUBSTR 함수로 USER_NAME 컬럼의 1번째 문자부터 1개 문자를 뽑아온다.

-concat(SUBSTR(USER_NAME,1,1),'*') 

CONCAT 으로 불러온 문자 1개와 뒤의 *를 합쳐 하나의 문자열(STRING)을 만든다. 

EX)김말복 이라면 김만 뽑아와서 뒤에 *을 붙여서 김* 으로 합친다.

-SUBSTR (USER_NAME,3,10)

SUBSTR 함수로 USER_NAME 컬럼의 3번째 문자부터 10개의 문자를 뽑아온다.

-concat(concat(SUBSTR(USER_NAME,1,1),'*'),SUBSTR (USER_NAME,3,10) )

두개의 문자열을 다시 concat 함수로 합친다.

EX) 김말복이라는 문자열은 김* 이라는 문자열과 3번째인 복 이라는 문자열을 합쳐 김*복 이 되어 나온다.

-----------------

CONCAT 함수

두개 이상의 컬럼을 하나의 스트링 값으로 반환하는 함수다.

스트링 타입이 아닌 인자가 지정되는 경우 자동으로 타입 변환이 수행되고

인자 중에 NULL이 포함되면 결과로 NULL을 반환한다.

SELECT

    CONCAT(column1, column2)

FROM

DUAL 

CONCAT 두개의 컬럼 사이에 || 을 넣으면 중간에 임의의 문자를 넣을 수 있다.

SELECT

    CONCAT(column1 || ' is ' || column2)

FROM

DUAL 

Python 에서 Mysql Insert 사용시 아래와 같이  Incorrect string value 에러가 할 경우 원인은 보통 2가지 입니다.

 Incorrect string value: '\xF3\xB0\x8B\xAF\xEA\xB8' for column 'content' at row 1

원인 1. Mysql 혹은 MariaDB 의 Charter set ( 문자셋 ) 문제

  보통 DB 의 Charter set 문제일 경우가 많습니다. 이 경우 DB 의 Character set 을 utf8 혹은 utf8mb4 로 변경해 주시거나 업데이트 해주시면 됩니다.

테이블 업데이트 쿼리는 대충 아래와 같습니다. 

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
ALTER TABLE table_name CHANGE column_name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

원인 2. Python mysql 의 접속 설정 문제

 제가 격은 문제 입니다. DB 의 생성은 Laravel 로 utf8mb4로 생성하고 Python 으로 콘텐츠를 넣는데 위와 같은 에러가 발생 하였고 원인은 mysql connect 옵션에서 utf8mb4 를 지정해줘야 하는 문제 였습니다. 

def connectMydb():
	print 'connectMydb'
	mydb = mysql.connector.connect(
	  host=str(os.environ.get("DB_HOST")),
	  user=str(os.environ.get("DB_USER")),
	  passwd=str(os.environ.get("DB_PASS")),
	  database=str(os.environ.get("DB_DATABASE"))
	)
	return mydb

위와 같은 코드에 아래와 같이 charset='utf8mb4' 를 추가 하였습니다.

def connectMydb():
	print 'connectMydb'
	mydb = mysql.connector.connect(
	  host=str(os.environ.get("DB_HOST")),
	  user=str(os.environ.get("DB_USER")),
	  passwd=str(os.environ.get("DB_PASS")),
	  database=str(os.environ.get("DB_DATABASE")),
	  charset='utf8mb4',
	)
	return mydb

기본적으로 python mysql 에서 접속 옵션으로 utf8 을 사용하는지 한글은 잘 동작하는데 특수 문자가 들어가려 하니 위와 같은 에러가 발생 했었습니다. 이제 한번 Python 을 통해서 해당 Insert 가 잘 동작하는지 한번 테스트 해보시기 바랍니다 :D

즐거운 개발 되시기 바랍니다.

���� �Ʒ��� ���� ������ ������ ��ϵǴ� ������ "���� �λ��� " ������ ������ �ǰ� �׵ڴ� ������ �ȵǴ�����.
(UTF-8 �� �����)

�� �ڽ������ Ư�����ڰ� mysql ���� ������ �߻��ϴµ��ѵ�..�̻��Ѱ� �ƿ� insert ������ ���°͵� �ƴϰ� "���� �λ��� " ������ ���������� ����� �˴ϴ�.

�ϵ� �̻��ؼ� nzeo.com �����Խ��ǿ��� �׽�Ʈ�� �÷��ô��� ���� ������ ���̴�����.
���� PHPSCHOOL������ ���������� ��ϵDZ���.(�Ƹ��� ����� euc-kr �̾ �׷���)

��� �ذ����� ������?

----------------------------------------------------------------
���� �λ��� 󰡐ȭ���� �۰� ����󰡑�� ���ȴ�.
-----------------------------------------------------------------

create table test(
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title text
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

SyntaxError: Non-UTF-8 code starting with '\xed' in file 이라는 에러가 났다

🎤 이 특수문자를 넣는것에서 에러가 났는데

mysql에서 기본 utf-8형태는 3바이트 자료형이기 때문에 저러한 특수문자는 지원하지 않는다. 따라서 4바이트 자료형으로 바꾸어 줘야한다.

ALTER DATABASE [DB명] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE [테이블명] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

명령어를 통해서 먼저 mysql 데이터베이스 테이블의 스트링형태의 자료형을 utf8mb4로 바꿔준다.

그러고 mysql connector 부분에서도 charset를 맞춰주면 된다.

여기 예시를 들어보면

create table test(
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title text
)

ALTER TABLE test CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

선언과 동시에 테이블 charset를 설정 할 수도 있음!

create table test(
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title text
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

위 방식으로 test 테이블을 생성하고

import pymysql

my_db = pymysql.connect(
    user='root',
    passwd='root',
    host='127.0.0.1',
    db='[데이터 베이스 명]',
    charset='utf8mb4'
)

cursor = my_db.cursor(pymysql.cursors.DictCursor)
data = [{'title':'🎤'}, {'title':'🎦'}, {'title':'🎲'}]
sql = 'insert into test (title) values (%(title)s)'

이런식으로 하시면 특수 문자 이모티콘도 정상적으로 들어가는걸 볼 수 있다.

커넥터쪽에 charset을 안바꾸고 계속 에러가 나서 삽질했다 ㅜ