짧은 텍스트 문자열을 SQL Server 데이터베이스에 어떻게 저장해야 합니까?

StackOverflow https://stackoverflow.com/questions/54512

문제

varchar(255), varchar(256), nvarchar(255), nvarchar(256), nvarchar(max) 등?

256은 멋지고 둥글며 공간 효율적인 숫자처럼 보입니다.하지만 255가 많이 사용되는 것을 보았습니다.왜?

varchar와 nvarchar의 차이점은 무엇입니까?

도움이 되었습니까?

해결책

VARCHAR(255).255자 저장 공간을 모두 사용하는 것이 아니라 필요한 저장 공간만 사용합니다.255가 아니라 256입니다. 255에 널 종결자(또는 크기 바이트)를 더한 공간이 있기 때문입니다.

"N"은 유니코드를 의미합니다.ASCII가 아닌 문자가 필요한 경우 사용하세요.

다른 팁

MS SQL Server(7.0 이상)에서 varchar 데이터는 내부적으로 최대 세 가지 값으로 표시됩니다.

  • 0부터 8000바이트를 초과하는 실제 문자열(페이지 크기, 행에 대해 저장된 다른 열 및 기타 몇 가지 요소를 기반으로 함)
  • 데이터 문자열의 길이를 나타내는 데 사용되는 2바이트(0에서 8000+ 사이의 값 생성)
  • 열이 Null을 허용하는 경우 행의 Null 비트마스크에 있는 1비트(따라서 최대 8개의 Null 허용 열의 Null 상태를 1바이트로 나타낼 수 있음)

중요한 부분은 2바이트 데이터 길이 표시기입니다.1바이트라면 길이가 0~255인 문자열만 제대로 기록할 수 있습니다.2바이트를 사용하면 길이가 0부터 64000+(구체적으로 2^16 -1)가 넘는 문자열을 기록할 수 있습니다.그러나 SQL Server 페이지 길이는 8k이며, 여기서 8000자 이상의 문자 제한이 발생합니다.(SQL 2005에는 데이터 오버플로 문제가 있지만 문자열이 너무 길어지면 varchar(max)를 사용해야 합니다.)

따라서 varchar 데이터 유형 열을 (15, 127, 511)로 선언한 기간에 관계없이 실제로 각 행에 저장되는 내용은 다음과 같습니다.

  • 문자열의 길이를 나타내는 2바이트
  • 실제 문자열, 즉해당 문자열의 문자 수

내 요점은 다음과 같습니다.많은 이전 시스템에서는 문자열 길이를 저장하는 데 1바이트만 사용했기 때문에 최대 길이가 255자로 제한되어 그다지 길지 않습니다.2바이트이면 임의의 제한이 없습니다...따라서 (기술적인 지식이 없는 것으로 추정되는) 사용자에게 적합한 숫자를 선택하는 것이 좋습니다., 저는 50, 100, 250, 500, 심지어 1000도 좋아합니다.8000바이트 이상의 기본 저장 공간을 고려하면 255 또는 256은 200 또는 250만큼 효율적입니다. 더 적은 최종 사용자에게 설명할 때가 되면 효율적입니다.

이는 단일 바이트 데이터(예:ansii, SQL_라틴어1*_*일반_CP1 등알.).여러 코드 페이지 또는 서로 다른 알파벳을 사용하는 언어에 대한 데이터를 저장해야 하는 경우 nvarchar 데이터 형식으로 작업해야 합니다. 이 형식은 문자 수에 대해 2바이트로 동일하게 작동하지만 데이터의 각 실제 문자에는 2바이트가 필요합니다. 바이트의 저장 공간).문자열이 8000개를 넘거나 nvarchar에서 4000개를 넘을 가능성이 있는 경우 [n]varchar(max) 데이터 유형을 사용해야 합니다.

데이터의 길이를 추적하기 위해 추가 바이트로 공간을 차지하는 것이 왜 그렇게 중요한지 알고 싶다면 다음을 확인하세요. http://www.joelonsoftware.com/articles/fog0000000319.html

필립

char/varchar 및 N 변형을 정의할 때 고려해야 할 몇 가지 다른 사항이 있습니다.

첫째, 데이터베이스에 가변 길이 문자열을 저장하는 데 약간의 오버헤드가 있습니다.일반적으로 좋은 경험 법칙은 길이가 10자 미만인 문자열에는 CHAR를 사용하는 것입니다. N/VARCHAR은 문자열과 길이 및 저장 간의 차이를 모두 저장하기 때문입니다. 짧은 N/CHAR의 문자열과10 미만의 N/VARCHAR은 문자열 길이에 따른 오버헤드를 감당할 가치가 없습니다.

둘째, SQL Server의 테이블은 8KB 페이지에 저장되므로 데이터 행의 최대 크기는 8060바이트입니다(나머지 192는 SQL의 오버헤드에 사용됩니다).이것이 바로 SQL이 VARCHAR(8000) 및 NVARCHAR(4000)의 최대 정의 열을 허용하는 이유입니다.이제 당신은 ~할 수 있다 VARCHAR(MAX) 및 유니코드 버전을 사용하세요.하지만 이와 관련된 추가 오버헤드가 있을 수 있습니다.

내가 착각한 것이 아니라면 SQL 서버는 행의 나머지 부분과 동일한 페이지에 데이터를 저장하려고 시도하지만 VARCHAR(Max) 열에 너무 많은 데이터를 넣으려고 하면 이를 이진으로 처리하고 다른 페이지에 저장하세요.

CHAR과 VARCHAR의 또 다른 큰 차이점은 페이지 분할과 관련이 있습니다.SQL Server가 8KB 페이지에 데이터를 저장한다는 점을 고려하면 한 페이지에 데이터 행을 얼마든지 저장할 수 있습니다.만약 너라면 업데이트 행이 더 이상 페이지에 맞지 않을 정도로 큰 값을 가진 VARCHAR 열, 서버는 나뉘다 해당 페이지에서 일부 레코드를 이동합니다.데이터베이스에 사용 가능한 페이지가 없고 데이터베이스가 자동 증가로 설정된 경우 서버는 먼저 데이터베이스를 늘려 빈 페이지를 할당한 다음 빈 페이지를 테이블에 할당하고 마지막으로 단일 페이지를 두 개로 분할합니다.

영어 이외의 언어를 지원하려면 nvarchar를 사용하는 것이 좋습니다.

HTML은 표준 ASCII 문자를 포함하는 한 괜찮습니다.저는 다국어를 지원하는 데이터베이스에서 주로 nvarchar를 사용했습니다.

있기 때문에 1바이트에 8비트 따라서 1바이트에는 최대 256개의 고유한 값을 저장할 수 있습니다.

0 1 2 3 4 5 ... 255

첫 번째 숫자는 0이므로 총계는 다음과 같습니다. 256 숫자.

따라서 nvarchar(255)를 사용하면 길이를 저장하는 1바이트 그러나 1만큼 팁을 주고 nvarchar(256)을 사용하면 1바이트를 더 낭비하게 됩니다. 단지 255개에서 추가 1개 품목 할인(필요하므로) 숫자 256을 저장하는 데 2바이트).

이는 SQL Server의 실제 구현이 아닐 수도 있지만 256개 항목 중 255개 항목으로 제한하는 일반적인 이유라고 생각합니다.

그리고 nvarchar 문자당 2바이트 이상을 사용하는 유니코드용입니다.
varchar 1바이트만 사용하는 일반 ASCII 텍스트용입니다.

IIRC, 255는 텍스트 데이터 유형으로 전환하기 전이나 어느 시점에 있었던 MySQL의 varchar의 최대 크기입니다(실제로 지금은 더 높다고 생각합니다).따라서 255로 유지하면 호환성이 향상될 수 있습니다.하지만 조치를 취하기 전에 먼저 살펴보는 것이 좋습니다.

varchar와 nvarchar는 ascii와 unicode와 비슷합니다.varchar는 문자당 1바이트로 제한되며, nvarchar는 2바이트를 사용할 수 있습니다.그렇기 때문에 varchar(8000)은 가질 수 있지만 nvarchar(4000)만 가질 수 있습니다.

varchar 및 nvarchar 모두 내용에 맞게 크기가 자동으로 조정되지만 열 유형을 선언할 때 정의하는 숫자는 최대값입니다.

유니코드는 2바이트이므로 "nvarchar"의 값은 "varchar"에 비해 두 배의 디스크/메모리 공간을 차지하지만 열 유형을 선언하면 바이트가 아닌 문자 수를 선언하게 됩니다.

따라서 열 유형을 정의할 때 열이 보유해야 하는 최대 문자 수를 결정하고 이를 varchar(또는 nvarchar) 크기로 유지해야 합니다.

경험상 좋은 규칙은 열이 보유해야 하는 최대 문자열 길이를 추정한 다음, 향후 예기치 않게 긴 데이터로 인해 발생하는 문제를 방지하기 위해 열에 약 10% 더 많은 문자에 대한 지원을 추가하는 것입니다.

varchar(255)는 SQL Server 7.0 및 이전 버전에서도 최대 길이였습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top