mysql strict mode 해제

Mysql 2016. 8. 1. 14:52

mac 로컬 환경에 mysql을 설치해서 데이터를 마이그레이션 하는도중에


datetime로 선언된 필드에서


Field 'expired' doesn't have a default value:


이런 에러가 났다.


어느정도 삽질후에 datetime 필드를 not null 로 했을때 insert 혹은 update를 하면서 아무값도 넣지 않으면


에러가 나는 것을 확인할수 있었는데, 실제 서비스에도 저렇게 되어있어서 datetime 필드의 설정을 바꿀수도없고... 다른 해결책을 찾다가


발견한 것이 있는데


mysql strict mode라는 것이다. 


이건 mysql 을 설치하면 기본으로 설정되어있는것인데, 


이게 무엇인지 단적으로 설명하자면 


not null로 된 필드에 값을 넣지 않으면 에러가 나고 값이 들어가지 않게 하는 것이다.


mysql korea문서에는 이렇게 써있다.


스트릭트 모드는 MySQL가 유효하지 않거나 누락된 (missing) 데이터를 처리하는 방법을 제어한다하나의 값은 여러 가지 이유로 유효하지 않게 된다예를 들면컬럼에 대해 틀린 데이터 타입을 가질 수가 있거나또는 범위를 벗어날 수도 있다삽입될 새로운 열이 자신의 정의문 안에서 명확한 DEFAULT 구문이 없는 -NULL컬럼 값을 가지고 있지 않을 때 데이터는 누락 된다. (NULL 컬럼의 경우NULL은 값이 누락되는 경우에 삽입된다.)


즉 값을 안정성있게 넣는 것이라는건데


이걸 알고나서 개인적으로 이 모드를 사용하는게 좋은게 아닐까라는 짧은 생각이 든다.


어찌댔든 현재 내 환경을 그렇지 않으므로 이 모드를 해제 해야 하는데


*nix계열의 운영체제에서는

my.cnf 파일을 찾아서 sql_mode에 STRICT_TRANS_TABLES 라는 옵션을 지우고 mysql을 재시작하면 이 옵션은 꺼지게된다.


windows계열은

my.ini파일을 찾아서 똑같이 하면된다고 한다.


혹시나  orm을 쓰는 개발자는 orm자체에서도 이 옵션이 설정될 수도 있으므로 my.cnf에서 설정을 끈후에 orm에서도 disable명령어가 있는지 찾아보는게 좋은것 같다.


왜냐면 나도 active-record를 쓰는데 mysql옵션을 껐는대도 계속 저옵션에 걸려 에러가 났는데 알고보니 active-record에서도 저 옵션을 켜서 사용 하고 있었다 


WRITTEN BY
rabbbit
필기

,

맥에서 잘되던 mysql이 갑자기 start가 안되면서

ERROR! The server quit without updating PID file

이런 에러를 뿜어낸다..


일단 에러 로그를 보니

2016-08-01T03:00:36.392061Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

2016-08-01T03:00:36.392116Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

2016-08-01T03:00:36.392143Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error

2016-08-01T03:00:36.696313Z 0 [ERROR] Plugin 'InnoDB' init function returned error.

2016-08-01T03:00:36.696353Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.

2016-08-01T03:00:36.696366Z 0 [ERROR] Failed to initialize plugins.

2016-08-01T03:00:36.696374Z 0 [ERROR] Aborting


ibdata1의 권한이 쓰기권한이여야 한다고 하는데 나는 권한을 건드린적이 없다..


건드린게 없는게 이상한 현상인데 해결 방법은 더 이상하다.


/usr/local/var/mysql


디렉토리를 777권한을 주면해결이 된다. 이게 대체 왜 되는건지 모르겠다..

그와 더불어 갑자기 잘되던게 왜 안되는건지도 모르겠다


나중에 시간을 들여서 찾아봐야겠다

'Mysql' 카테고리의 다른 글

mysql strict mode 해제  (0) 2016.08.01
mysql]insert 서브쿼리 사용법  (0) 2015.02.23
mysql] 쿼리문에서 문자열 붙이기  (0) 2015.02.23
[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08

WRITTEN BY
rabbbit
필기

,

insert into 테이블명 select 가져올필드 from 가져올테이블 where 가져올조건; 
또는 
insert into 테이블명(넣을필드,넣을필드,넣을필드...) select 가져올필드,가져올필드,가져올필드... from 가져올테이블 where 가져올조건; 


'Mysql' 카테고리의 다른 글

mysql strict mode 해제  (0) 2016.08.01
mac 에서 ERROR! The server quit without updating PID file 에러  (0) 2016.08.01
mysql] 쿼리문에서 문자열 붙이기  (0) 2015.02.23
[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08

WRITTEN BY
rabbbit
필기

,

SELECT CONCAT( string1 , string2 )


이런식으로 사용하면 어디서 불러오든 직접 쓰든 사용이 가능하다.


concat 안에서 서브쿼리도 사용 가능하다고 하니 한번 써봐야겠다

'Mysql' 카테고리의 다른 글

mac 에서 ERROR! The server quit without updating PID file 에러  (0) 2016.08.01
mysql]insert 서브쿼리 사용법  (0) 2015.02.23
[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08
mysql 테이블 내용 수정  (0) 2014.07.07

WRITTEN BY
rabbbit
필기

,

[MySql] alter

Mysql 2014. 8. 22. 15:09

1. 필드 타입 변경

alter table 테이블명 modify column 기존필드명 변경할필드타입


2. 필드 타입 및 필드명

alter table 테이블명 change column 기존필드명 변경할필드명 변경할필드타입


3. 필드 추가

alter table 테이블명 add column 추가할필드명 필드타입


4. 필드 삭제

alter table 테이블명 drop column 삭제할필드명


5. 테이블명 변경

alter table 테이블명 rename 변경할테이블명

'Mysql' 카테고리의 다른 글

mysql]insert 서브쿼리 사용법  (0) 2015.02.23
mysql] 쿼리문에서 문자열 붙이기  (0) 2015.02.23
mysql 테이블 데이타 복사  (0) 2014.07.08
mysql 테이블 내용 수정  (0) 2014.07.07
mysql 데이타베이스 생성  (0) 2014.07.01

WRITTEN BY
rabbbit
필기

,

Mysql 테이블 복사하기


복사할 테이블이 존재 하지 않는 경우


-> 테이블 생성후, 데이터를 복사

create table 대상 테이블명 select * from 원본 테이블명


복사할 테이블이 존재하는 경우 

기존의 데이터를 바로 복사 

-> INSERT INTO [대상 테이블명] SELECT * FROM [원본 테이블명]  


다른 데이터 베이스 간의 테이블 값 복사 

mysql> INSERT INTO [대상 데이터베이스명].[대상 테이블명] 

        -> SELECT * FROM [원본 데이터베이스명].[원본테이블명] 



필드의 타입과 숫자가 다르면 당연히 복사가 안된다.



  중복 데이터에 대한 에러를 무시하는 방법 

대상 필드가 기본키로 지정되어 있는데 중복 레코드로 인하여 에러를 발생시 다음과 같이 처리할 수 있다. 

mysql> INSERT ignore INTO .....



출처 - http://ra2kstar.tistory.com/109

'Mysql' 카테고리의 다른 글

mysql] 쿼리문에서 문자열 붙이기  (0) 2015.02.23
[MySql] alter  (0) 2014.08.22
mysql 테이블 내용 수정  (0) 2014.07.07
mysql 데이타베이스 생성  (0) 2014.07.01
컬럼 내용 수정하기  (0) 2014.06.30

WRITTEN BY
rabbbit
필기

,

update table_name set column="fff" where u_id="123123";


where 절에서 


값의 비교를 통해서도 가능

where no>3   - 3보다 큰 값들만 수정


update ABCDE set column1=replace(column1,'코리아','한국')
'ABCDE' 테이블의
'column1' 컬럼 값에 '코리아' 라는 단어가 포함되어 있다면 모두 '한국' 으로 수정한다.


출처 : http://www.technote.co.kr/php/technote1/board.php?board=faq&command=body&no=14

'Mysql' 카테고리의 다른 글

[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08
mysql 데이타베이스 생성  (0) 2014.07.01
컬럼 내용 수정하기  (0) 2014.06.30
테이블 생성  (0) 2014.05.14

WRITTEN BY
rabbbit
필기

,

create database db_name

'Mysql' 카테고리의 다른 글

[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08
mysql 테이블 내용 수정  (0) 2014.07.07
컬럼 내용 수정하기  (0) 2014.06.30
테이블 생성  (0) 2014.05.14

WRITTEN BY
rabbbit
필기

,

컬럼 내용 수정하기

Mysql 2014. 6. 30. 14:49


show create table table_name


으로 테이블 생성 쿼리문을 복사에서 수정하고 싶은 컬럼의 내용만 복사


alter table table_name change table_name table_name table_propertie 

'Mysql' 카테고리의 다른 글

[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08
mysql 테이블 내용 수정  (0) 2014.07.07
mysql 데이타베이스 생성  (0) 2014.07.01
테이블 생성  (0) 2014.05.14

WRITTEN BY
rabbbit
필기

,

테이블 생성

Mysql 2014. 5. 14. 09:15

테이블 생성


create table 테이블이름 (colum1, colum2, ....)


ex)


create table makeTable(

idx int(10) unsigned not null auto_increment primary key,//기준이 되는 키

name varchar(50) default 'null' not null,
regDate datetime default '00-00-00 00:00' not null

);


Msql 자료형


* TINYINT (1 Byte)
부호있는 정수 : -128 ~ 127
부호없는 정수 : 0 ~ 255

* SMALLINT (2 Byte)

부호있는 정수 : -32768 ~ 32767
부호없는 정수 : 0 ~ 65535

* MEDIUMINT (3 Byte)

부호있는 정수 : -8388608 ~ 8388607
부호없는 정수 : 0 ~ 16777215

* INT (4 Byte)

부호있는 정수 : -2147483648 ~ 2147483647
부호없는 정수 : 0 ~ 4294967295

* BIGINT (8 Byte)

부호있는 정수 : -9223372036854775808 ~ 9223372036854775807
부호없는 정수 : 0 ~ 18446744073709551615

* FLOAT

단일 정밀도를 가진 부동소수점
-3.402823466E+38 ~ 3.402823466E+38

* DOUBLE

2배 정밀도를 가진 부동소수점
-1.79769313486231517E+308 ~ 1.79769313486231517E+308

* DATE

날짜를 표현하는 유형
1000-01-01 ~ 9999-12-31

* DATETIME

날짜와 시간을 표현하는 유형
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

* TIMESTAMP (4 Byte)

1970-01-01 00:00:00 부터 2037년까지 표현

* TIME

시간을 표현하는 유형
-839:59:59 ~ 838:59:59

* YEAR

년도를 표현하는 유형
1901년 ~ 2155년

* CHAR(M)

고정길이 문자열을 표현하는 유형
M = 1 ~ 255

* VARCHAR(M)

가변길이 문자열을 표현하는 유형
M = 1 ~ 255

* TINYBLOB

255개의 문자를 저장

* BLOB

63535개의 문자를 저장

* TEXT

문자를 저장하는 유형

* MEDIUMBLOB

16777215개의 문자를 저장

'Mysql' 카테고리의 다른 글

[MySql] alter  (0) 2014.08.22
mysql 테이블 데이타 복사  (0) 2014.07.08
mysql 테이블 내용 수정  (0) 2014.07.07
mysql 데이타베이스 생성  (0) 2014.07.01
컬럼 내용 수정하기  (0) 2014.06.30

WRITTEN BY
rabbbit
필기

,