얕고넓은지식/Computer knowledge

그누보드 글쓰기 글자수 늘리기 제한풀기

쪽마 2023. 3. 5. 23:48
반응형

그누보드
게시판 본문 글자수 제한 해제 그누보드 게시판 본문 글자수 제한 해제

 

 

 

 

 

 

 

 

 

 

1. 게시판 필드 타입 변경

그누보드는 게시판 내용 wr_content 필드 타입이 text 로 되어 있습니다.
해당 필드를 text 에서 mediumtext 또는 longtext 로 변경합니다.

수정 화면에서 필드 종류를 TEXT 에서 MEDIUMTEXT 로 변경
phpMyAdmin 을 사용하기 곤란한 상황이라면 이렇게 하세요.
해당 게시판에서 사용하고 있는 게시판 스킨 write.skin.php 파일 상단 <?php………. ?> 안쪽에 다음 코드를 추가합니다.
longtext 로 변경하려면 이렇게..
sql_query(” ALTER TABLE `{$write_table}` CHANGE `wr_content` `wr_content` longtext NOT NULL “);
mediumtext 로 변경하려면 이렇게..
sql_query(” ALTER TABLE `{$write_table}` CHANGE `wr_content` `wr_content` mediumtext NOT NULL “);
longtext 또는 mediumtext 둘 중 하나만 선택해서 적용하세요.
write.skin.php 파일에 위 코드를 추가하고 게시판 클릭 후 글쓰기 화면을 한 번 띄워주면 자동으로 변환됩니다.
다른 게시판도 바꾸고 싶으면 변환하고자 하는 게시판을 클릭 후 마찬가지로 글쓰기 화면을 띄워주면 됩니다.
해당 게시판에 사용되고 있는 스킨 파일에 적용한 게 맞는지 정확히 확인하세요.
요즘은 반응형 테마까지 나와서 다른 스킨 파일에 잘 못 적용하신 분들이 의외로 많이 계십니다.
적용 후 해결이 되면 추가했던 위 코드는 다시 삭제하세요.

 

 

2. bbs/write_update.php 파일 수정

if (isset($_POST[‘wr_content’])) {
$wr_content = substr(trim($_POST[‘wr_content’]),0,65536);
$wr_content = preg_replace(“#[\\\]+$#”, “”, $wr_content);
}
여기서 이 부분 숫자를 늘려주거나..
$wr_content = substr(trim($_POST[‘wr_content’]),0,16777216);
(MEDIUMTEXT 는 1~16777215 까지, LONGTEXT 는 1~4294967295 까지입니다.)

아니면 이렇게 없애버립니다.
$ wr_content = trim ($ _ POST [ ‘wr_content’]);

그래도 문제있는 부분이있는  파일 삭제
/ lib / editor.lib.php 에서 maxlength = \ “65536 \”

function editor_html ($ id, $ content)
{
return “<textarea id = \”$ id \ “name = \”$ id \ “style = \”width : 100 %; \ “maxlength = \”65536 \ “> $ 내용 </ textarea>”;
}

 

 

 

MySQL 최적의 데이터 타입 선택 방법

  • 타입은 작을수록 좋다

일반적으로 데이터를 저장하고 표현하는 데 문제가 없는 데이터 타입 중 가장 작은 것을 골라야 한다. 보통 작은 데이터 타입일수록 디스크나 메모리, CPU 캐시에 더 적은공간을 사용하기 때문에 더 빠르다. 게다가 작은 데이터 타입일수록 CPU도 덜 소비한다.

하지만 저장할 값의 크기를 너무 작게 추정하지 않도록 주의해야 한다. 스키마의 이곳저곳에서 데이터 타입의 범위를 늘리는 것은 어렵고, 시간을 많이 소용하게 되는 작업이기 때문이다.

  • 타입은 단순한 게 좋다

보통 간단한 데이터 타입을 처리할수록 CPU 사이클로 덜 소비한다. 예로 문자 비교보다는 정수 비교가 비용이 더 저렴하다. 문자 비교는 문자 셋 (Character set)과 콜레이션 (Collation) 으로 인해 복잡해지기 때문이다. 날짜와 시간은 문자열로 저장하지 말고, MySQL의 내장 형식에 저장해야 하며 IP 주소는 정수를 이용해 저장해야 한다.

IP 주소를 사용할 수 있는 함수로 INET_ATON 함수와 INET_NTOA 함수가 있으니 참고

  • 가능하면 NULL을 쓰지 말자

컬럼은 되도록이며 NOT NULL (NULL 허용 안함)로 정의해야 한다. NULL 허용이 기본값이다 보니 사용하는 응용 프로그램이 NULL (값이 없음)을 저장할 필요가 없을 때조차 테이블에 NULL을 허용하는 컬럼을 포함시킨 경우가 많다. NULL을 저장할 의도가 아니라면 컬럼을 NOT NULL로 정의하자.

NULL 허용 컬럼은 저장 공간도 더 많이 사용하며 NULL 허용 컬럼을 인덱싱할 땐 항목마다 한 바이트씩 더 들어간다. 만약 ‘값이 없다’는 사실을 테이블에 기록해야 하더라도 굳이 NULL을 쓸 필요는 없을지 모른다. NULL 대신 0이나 특수한 어떤 값, 빈 문자열 등을 사용하는 걸 고려해보자.

정수 타입

데이터타입 범위 바이트
signed unsigned
TINYINT -128 ~ 127 0 ~ 255 1 바이트
SMALLINT -32768 ~ 32767 0 ~ 65535 2 바이트
MEDIUMINT -8388608 ~ 8388607 0 ~ 16777215 3 바이트
INT -2147483648 ~ 2147483647 0 ~ 4294967295 4 바이트
BIGINT -9223372036854775808
~ 9223372036854775807
0 ~ 18446744073709551615 8 바이트
DECIMAL 전체자리수(precision)와 소수점자리수(scale)를 가짐
  • DECIMAL(5)의 경우: -99999 ~ 99999
  • DECIMAL(5, 1)의 경우: -9999.9 ~ 9999.9
  • DECIMAL(5, 2)의 경우: -999.99 ~ 999.99
가변
FLOAT -3.402823466×1038 ~ 3.402823466×1038 4 바이트
DOUBLE -1.7976931348623157×10308 ~ 1.7976931348623157×10308 8 바이트
 

정수를 저장할 거라면 정수(integer) 타입인 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 중 하나를 사용할 수 있다. 이 타입들은 8, 16, 24, 32, 64 비트의 저장 공간이 필요하다. 정수 타입에는 UNSIGNED (부호 없음) 속성을 사용할 수도 있으며, 이 속성은 음수 값을 허용하지 않는 대신 저장 가능한 양수 값의 한도를 거의 두 배로 늘려준다.

어떤 데이터 타입을 골랐느냐에 따라 MySQL에서 데이터를 메모리 나 디스크에 저장하는 방식이 결정된다. 하지만 32비트 아키텍처라도 정수를 계산할 땐 보통 64비트 BIGINT 정수를 사용한다(일부 집합 함수는 예외적으로 DECIMAL이나 DOUBLE을 사용한다)

MySQL에선 INT(11)과 같이 정수 타입의 ‘길이’를 명시할 수 있다. 하지만 이 기능은 값의 유효 범위를 제한하진 않고, MySQL 클라이언트 같은 프로그램의 화면 출력용으로 예약하는 문자의 개수를 지정할 뿐이므로 대부분의 응용프로그램에 선 별다른 의미가 없다. 저장이나 계산 측면에서 INT(1)은 INT(20)과 동일하다.

실수 타입

실수는 소수부가 있는 숫자다. 하지만 단지 소수부 때문에 실수가 있는 건 아니다. BIGINT로 표현할 수 없을 만큼 큰 정수도 DECIMAL을 이용하면 저장 가능하다. MySQL에서는 정확한 타입과 부정확한 타입을 모두 지원한다.

DECIMAL

  • 고정소수점 (fixed-point types)
  • NUMERIC 타입도 포함
  • 소수부를 정확하게 저장하는 용도로 사용
  • DECIMAL(M,D)
    • M은 소수 부분을 포함한 실수의 총 자릿수를 나타내며 최대값은 65
    • D는 소수 부분의 자릿수를 나타내며, D가 0이면 소수 부분을 가지지 않음

DOUBLE

  • 부동소수점 (floating-point types)
  • FLOAT 타입도 포함
  • 대략적인 숫자 데이터 값(근사값)을 표현할 때 사용
  • DOUBLE(M,D)
    • M은 소수 부분을 포함한 실수의 총 자릿수
    • D는 소수 부분의 자릿수

문자열 타입

MySQL은 문자열 데이터 타입을 몇 가지 밖에 지원하지 않지만 각 타입마다 여러 가지 변형이 있으며 특히 VARCHAR 타입과 CHAR 타입의 서로 다른 특징을 파악해두면 MySQL 최적의 데이터 타입 선택 방법 에 도움이 될 것으로 보여진다.

VARCHAR

  • 가변 길이의 문자열을 저장하는 가장 흔한 문자열 데이터 타입
  • 필요한 만큼만 공간을 사용하기에 고정 길이 타입보다 저장 공간을 적게 사용하기도 한다.
  • 공간을 절약하므로 성능에 도움이 되지만 행이 가변 길이이므로 행을 업데이트할 때 행의 길이가 길어지기도 하며, 이러한 이유로 추가적인 작업이 필요할 수도 있다.
  • 보통 컬럼의 최대 길이가 평균 길이보다 훨씬 클 때나 필드가 업데이트되는 일이 드물어서 단편화가 문제되지 않을 때 혹은 UTF-8 처럼 문자마다 사용하는 바이트 수가 다른 복잡한 문자 셋을 사용할 때 유용하다.

CHAR

  • 고정 길이이므로 MySQL에서는 항상 지정된 문자 개수에 맞춰 충분한 공간을 할당한다.
  • 아주 짧은 문자열을 저장하고자 할 때나 모든 값이 거의 같은 길이일 때 유용하다. 예를 들면 MD5의 경우 값의 길이가 언제나 같기 때문에 이 값을 저장할 땐 CHAR가 적합하다. 고정 길이의 행은 단편화가 거의 발생하지 않으므로 자주 바뀌는 데이터를 저장할 때라면 CHAR가 VARCHAR보다 유리하다.
  • 아주 짧은 컬럼에도 CHAR를 사용하는 것이 VARCHAR를 사용하는 것보다 효율적이다. Y와 N값만 저장하는 것처럼 한 바이트짜리 문자 셋이라면 CHAR(1)은 1바이트만 사용하지만 VARCHAR(1)에선 길이 바이트 때문에 2바이트를 쓴다.

예를들어 ‘good’ 값을 저장하면 VARCHAR(4) 컬럼이든 VARCHAR(100) 컬럼이든 같은 공간을 차지한다. 하지만 MySQL 에서 내부적으로 값을 저장할 때 고정 크기의 메모리를 할당하므로 큰 컬럼을 사용하면 메모리를 더 많이 사용하게 될수도 있다. 그러면 메모리 안에 있는 임시 테이블을 사용하는 연산이나 정렬이 필요한 경우 성능이 안 좋을 수 있다. 그러므로 가장 좋은 방법은 필요한 만큼만 공간을 할당하는 것이다.

BLOB 타입과 TEXT 타입

  • BLOB 및 TEXT 군의 유일한 차이점이라곤 BLOB 타입은 문자 셋이나 콜레이션이 없는 바이너리 데이터를 저장하는 반면, TEXT 타입은 문자 셋과 콜레이션이 있는 텍스트 데이터를 저장한다는 것이다.
  • BLOB – 바이너리 형식 (TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB, LONGBLOB)
  • TEXT – 텍스트 형식 (TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT, LONGTEXT)

날짜 및 시간 타입

MySQL은 날짜와 시간 값에 쓰는 데이터 타입이 다양하다. MySQL이 저장할 수 있는 가장 작은 시간 단위는 1초이지만 시간 연산은 마이크로초 단위로 수행 가능하다.

자료형 범위
DATE 0000-00-00 ~ 9999-12-31
DATETIME 0000-00-00 00:00:00 ~ 9999-12-31 23:59:59
TIMESTAMP 1970-01-01 00:00:00 이후로 지난 초
TIME -838:59:59 ~ 838:59:59
YEAR 1901 ~ 2155

DATETIME

  • 날짜와 시각을 표현하는 ANSI 표준 방식
  • 1001년부터 9999년까지의 값을 1초 단위로 저장할 수 있으며, 날짜와 시각을 YYYYMMDDHHMMSS 포멧의 정수 값으로 묶는데 시간대에는 영향을 받지않는다.
  • DATETIME은 8바이트의 저장 공간을 사용한다.

TIMESTAMP

  • TIMESTAMP 타입은 1970년 1월 1일 자정(그리니치 평균시)을 기준으로 몇 초가 지났는지를 저장하며, Unix 타임스탬프와 동일하다.
  • TIMESTAMP는 저장 공간을 4바이트 사용하므로 값의 범위가 DATETIME보다 훨씬 작고, 1970년 ~ 2038년 사이의 값만 저장할 수 있다.
  • MySQL에서 TIMESTAMP 컬럼에 값을 지정하지 않은 채로 행을 추가하면 첫 번째 TIMESTAMP 컬럼에 현재 시작을 넣는다. 또 UPDATE문에 업데이트 할 첫 번째 TIMESTAMP 값을 명시적으로 할당하지 않은 채로 행을 업데이트 하면 TIMESTAMP 컬럼의 값을 자동으로 업데이트한다.
  • 다른 데이터 타입과는 달리 TIMESTAMP 컬럼은 기본적으로 NOT NULL 이다.

비트(Bit) 데이터 타입

  • Bit 타입은 비트의 값을 저장하며 0과 1로 구성되는 바이너리(Binary) 값을 저장할 수 있다.
  • Bit(M) : M의 범위는 1 부터 64까지 설정할 수 있으며, 명시한 M 비으틔 값을 저장할 수 있다.
  • MySQL은 Bit를 숫자 타입이 아닌 문자열 타입으로 취급한다. bit(1) 값을 조회하게 되면 그 결과 타입도 문자열이지만 내용물은 바이너리 값인 0이나 1이지 ASCII 값인 “0”이나 “1”이 아니다. 하지만 값을 숫자 기반으로 조회한다면 비트 문자열이 변환된 숫자가 결과로 나온다.

지금까지 MySQL 최적의 데이터 타입 선택 방법 대해서 알아보았는데, 위의 타입 이외에도 더 많은 타입이 있지만 여기에서는 범용적으로 많이 사용하고 있는 데이터 타입에 대해서 정리를 해보았다. 각 데이터 타입의 특징을 파악하여 SQL 작성시에도 참고하면 좋을 것 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MySQL  데이터 타입( Data Type )

문자형 (String Type)

  • CHAR(n) : 고정길이 데이터 타입 (최대 255byte) - 지정된 길이보다 짧은 데이터 입력시 나머지 공간이 공백(Null)으로 채워짐
  • CHAR(0) 은 NULL을 의미하며 NULL 혹은 ' '(빈 문자열) 만을 가질 수 있다

 

  • VARCHAR(n) : 가변길이 데이터 타입(최대 65535byte) - 지정된 길이보다 짧은 데이터 입력시 나머지 공간 채우지 않는다
  • char & varchar : 같은 문자열을 char 와 varchar로 저장한 경우 두 값을 equal() 로 비교했을때 false 가 나올수 있다 (CHAR의 경우 공백을 NULL 로 채우기 때문에)
  • trim() 으로 필터링한후 비교하면 true가 나올수 있다
  • 따라서 고정길이 문자열이 아닌경우varchar를 쓰는것이 좋다고 생각 됨 (대부분 varchar를 사용)
  • NVARCHAR : 가변 유니코드 문자열, 모든 문자를 2byte로 저장
  • * varchar nvarchar : 가변 문자열과 가변 유니코드 문자열 다국어 지원을 하는 경우는 nvarchar 사용이 유리

 

 

TINYTEXT(n) : 문자열 데이터 타입(최대 255byte )

TEXT(n) : 문자열 데이터 타입(최대 65535byte)

MEDIUMTEXT(n) : 문자열 데이터 타입(최대 16777215byte)

LONGTEXT(n) : 문자열데이터 타입(최대 4294967295byte)

BINARY(n) & BYTE(n) : char 형태의 이진 데이터 타입(최대 255byte)

LONGBLOB(n) : 이진 데이터 타입(최대 4294967295byte)

MEDIUMBLOB(n) : 이진 데이터 타입(최대 16777215byte)

BLOB(n) : 이진 데이터 타입(최대 65535byte)

TINYBLOB(n) : 이진 데이터 타입 (최대 255byte)

VARBINARY(n) : varchar 형태의 이진 데이터 타입 (최대 65536byte)

ENUM : 문자 형태인 value를 숫자로 저장 value 중에 하나만 저장하며 value가 255 이하인 경우에는 1byte 사용, 65535 이하인 경우에는 2byte 사용

SET : 목록에서 선택되어야 하는 문자열을 0개 이상 가질 수 있는 객체, 최대64개의 중복되지 않는 문자열을 가질 수 있다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형