본문 바로가기

DBMS/SQL Server

[SQL Server] 길이를 명시하지 않고 문자열을 선언한 경우

 

길이를 명시하지 않고 문자열을 선언하면 그 길이는 얼마로 적용될까?

 

문자열 변수를 선언하면서 길이를 명시하지 않은 경우

 

CHAR, VARCHAR, NCHAR, NVARCHAR 데이터 형식에 길이를 명시하지 않고 테스트 해보았다.

결과를 보면 문자열 변수를 선언하면서 길이를 명시하지 않으면, 길이는 1로 정해지는 것을 확인할 수 있다.

 

 DECLARE @A CHAR = 'DATA'

 DECLARE @B CHAR = '데이터'

 DECLARE @C VARCHAR = 'DATA'

 DECLARE @D VARCHAR = '데이터'

 DECLARE @E NCHAR = 'DATA'

 DECLARE @F NCHAR = '데이터'

 DECLARE @G NVARCHAR = 'DATA'

 DECLARE @H NVARCHAR = '데이터'

 

 SELECT @A AS A, @B AS B, @C AS C, @D AS D

      , @E AS E, @F AS F, @G AS G, @H AS H

 

 

 

 

 

CAST, CONVERT 함수 사용시 문자열에 길이를 명시하지 않은 경우

 

CAST, CONVERT 함수를 사용할 때 문자열에 길이를 명시하지 않으면 어떻게 될까?

문자열 변수에 길이를 명시하지 않았을 때와 같이 길이는 1이 될까?

확인하기 쉽게 30번째 문자에 B로 표시해 두었다.

그리고 확인해보면 길이가 30으로 정해지는 것을 확인할 수 있다.

 

 DECLARE @A CHAR = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA'

 

 SELECT @A AS A

      , CAST('AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA' AS CHAR) AS B

      , CONVERT(CHAR, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA') AS C

 

 

 

 

 

테이블 생성시 길이를 명시하지 않은 경우

 

열에 정의된 길이보다 긴 문자열을 입력하려고 하면 데이터가 잘린다는 오류 메시지가 발생한다.

 

 CREATE TABLE ABC (

     A VARCHAR

 )

 GO

 

 INSERT INTO ABC VALUES ('KIM')

 GO

 

 

 

 

 

프로시저 생성시 길이를 명시하지 않은 경우

 

오류는 발생하지 않지만 입력되는 데이터에서 첫 번째 문자만을 열에 입력하게 된다.

저장 프로시저로 전달된 문자열이 온전하게 테이블에 입력되지 않은 이유를 찾기 위해서는 사람이 일일이

찾아야 하는 노력은 물론이고, 어느 정도 운도 따라 할 정도로 찾기가 어렵다.

 

 CREATE PROC A_INSERT

    @A VARCHAR

 AS

    INSERT INTO ABC VALUES (@A)

 GO

 

 EXEC A_INSERT 'KIM'

 GO

 

 SELECT * FROM ABC

 GO

 

 

 

 

문자열을 정의할 때는 반드시 길이를 명시하여 이와 같은 문제들이 발생하는 것을 사전에 방지하자.