카테고리 없음

TextArea 줄 바꿈으로 인해 오류가 발생했습니다. 다양한 문자 유형에 비해 값이 너무 깁니다 (1000).

기록만이살길 2021. 2. 23. 12:06
반응형

TextArea 줄 바꿈으로 인해 오류가 발생했습니다. 다양한 문자 유형에 비해 값이 너무 깁니다 (1000).

1. 질문(문제점):

textarea 태그가있는 html 페이지가 있습니다.

텍스트 영역 (및 해당 postgres db 필드)은 1000자를 허용합니다.

1000 자 (단어 사이의 공백 포함)로 된 단일 단락 텍스트를 작성하고 저장을 클릭하면 db에 올바르게 저장됩니다.

그러나 한 문자를 줄 바꿈으로 바꾸면 저장을 클릭하면 다음 오류가 발생합니다.

org.postgresql.util.PSQLException: ERROR: value too long for type character varying(1000)

컨트롤러 방법을 입력하기 전에 오류가 발생합니다.

왜 그럴까요?

문제는 줄 바꿈을 허용하는 것이 아닙니다.

전체 문자 수가 제한 (총 900 개)보다 훨씬 적 으면 여러 줄 바꿈을 삽입 할 수 있고 잘 저장되기 때문입니다.

따라서 문자 제한에 가까워 졌을 때 줄 바꿈을 수락하면 오류가 발생하는 이유를 이해할 수 없습니다.

다음은 코드입니다.

<textarea type="text" name="description" maxlength="1000" th:text="${descBind.description}" cols="55" rows="16"></textarea>
</br> <input type="submit" name="btnSave" value="Save" />

모델

@Entity
public class Desc implements Serializable {

    private static final long serialVersionUID = 1L;    

    @Column(length = 1000)
    private String description;
    

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }   
}

제어 장치

@RequestMapping(value = "descriptionpage", params = "btnSave", method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute Desc desc, RedirectAttributes attributes) {

    //code to update the db

    ModelAndView modelAndView = new ModelAndView("descriptionpage.html");
    modelAndView.addObject("descBind", desc);
        
    return modelAndView;
}

2. 해결방안:

된 HTML로 사용자 타입 데이터 때 <textarea>상기 Enter키는 줄 바꿈 하나의 형태로 첨가되게한다 U+000A LINE FEED(LF) 문자 (참조 참조 ).

Windows 스타일의 CR-LF 줄 바꿈을 텍스트 영역에 붙여 넣으려고하면 단일 LF 문자로 표준화됩니다.

그러나 양식 제출 중에 동일한 데이터가 처리되면의 데이터 <textarea>가 "정규화"됩니다 (위와 동일한 참조).

줄 바꿈이 U + 000D CARRIAGE RETURN U + 000A LINE FEED (CRLF) 문자 쌍을 사용하도록 정규화되었습니다.

따라서 일반적으로 단일 LF를 CR-LF 쌍으로 대체하는이 프로세스를 수행하는 것은 브라우저입니다.

이로 인해 Java 문자열이 저장 될 데이터베이스 필드에 비해 너무 길면 문자열의 모든 CR-LF 쌍을 LF로 변환 할 수 있습니다.

String text = text.replace("\r\n", "\n");

(이전 의견 무시 : System.lineSeparator()양식 데이터를 처리하기위한 HTML 사양을 따르기 때문에 우리가 보는 동작을 제어 하는 설정이 아니라 브라우저입니다.)

65816609
반응형