URL에 가장 적합한 데이터베이스 필드 유형


352

MySQL 테이블에 URL을 저장해야합니다. 길이가 정해지지 않은 URL을 보유 할 필드를 정의하는 가장 좋은 방법은 무엇입니까?


1
필요한 것, 인덱싱, 단일성에 달려 있습니까?
Thomas Decaux

2
나는 여기에 상당히 간단한 답변을 기대하고 있었지만 고려하지 않은 항목에 대한 답변에 상당히 놀랐습니다. 교육 계정에 추가 한 매우 흥미로운 내용입니다.
HPWD

1
TEXT유형 에 따라 아래의 모든 답변을 읽는 것을 건너 뛰십시오. 결국 그것은 대부분의 사람들이 제안하는 것입니다. :) 물론, 당신은 인덱싱 또는 고유성을 필요로하는 경우, 가고 VARCHAR있기 때문에, TEXT캔 인덱싱되지 쉽게 것을 .
Aleksandar

답변:


324
  1. 널리 사용되는 웹 브라우저 중 최소 공통 분모 최대 URL 길이 : 2,083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    VARCHAR 열의 값은 가변 길이 문자열입니다. 길이는 MySQL 5.0.3 이전에는 0에서 255 사이의 값으로, 5.0.3 이상에서는 0에서 65,535 사이의 값으로 지정할 수 있습니다. MySQL 5.0.3 이상에서 VARCHAR의 유효 최대 길이는 최대 행 크기 (모든 열간에 공유되는 65,535 바이트) 및 사용 된 문자 세트에 따라 달라집니다.

  3. 그래서 ...
    <MySQL 5.0.3은 TEXT를 사용
    하거나
    > = MySQL 5.0.3은 VARCHAR을 사용합니다 (2083)


14
좋은 대답이지만 성격은 길이를 제한합니다. 프로젝트에 따라 허용되는 URL을 제한 할 수 있습니다. 누가 200보다 긴 URL을 사용합니까?
John

2
오라클은 uri의 구조를 "이해"하여 uri의 데이터 구조를 "이해"하여 색인 생성 및 검색이 효율적으로 수행되도록 uri 데이터 유형을 확보하는 것이 좋습니다. mysql은 이제 Oracle의 ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben

80
이 답변은 약간 오해의 소지가 있습니다. 여기서 "최소 공통 분모"는 의미가 없습니다 . 브라우저 나 서버에서 허용 하는 최고 숫자 를 사용하려고합니다 (일관되지 않고 변경 될 수 있음). 귀하의 링크가 말하기를 : " ... HTTP 프로토콜의 사양은 ... 어떤 최대 길이를 지정하지 않습니다 그래서 신경 쓰지 않는다" VARCHAR(2083)단지 사용 TEXT.
웨슬리 머치

4
예, 또한 링크에서 : " 65536 개 문자 후, 위치 표시 줄 더 이상 표시 윈도우 파이어 폭스 1.5.x.에있는 URL은 그러나 더 이상 URL이 작동합니다 내가 10 개 문자 후 테스트를 멈췄다.. "
웨슬리 Murch

1
boutell.com 리소스가 인터넷에서 떨어졌습니다. 다음은 스캔 한 O'Reilly 책에 대한 참조입니다. books.google.ca/…
micahwittman

33

VARCHAR(512)(또는 유사) 충분해야합니다. 그러나 문제가되는 URL의 최대 길이를 모르기 때문에로 직접 갈 수도 있습니다 TEXT. 이것의 위험은 물론 CLOB간단한 문자열 데이터 유형보다 훨씬 느리기 때문에 효율성이 떨어 집니다 VARCHAR.


데이터 정렬은 어떻습니까?
kommradHomer

16

varchar(max) SQLServer2005 용

varchar(65535) MySQL 5.0.3 이상

이는 필요에 따라 스토리지를 할당하며 성능에 영향을 미치지 않아야합니다.


1
코드 조각에서 max필요에 따라 VARCHAR 크기를 늘리는 마술 ANSI SQL 지정자입니까, 아니면 예를 들어 메타 변수입니까?
Daniel Spiewak

4
MySQL에서는 테이블의 유일한 열이 아닌 한 큰 varchar를 가질 수 없습니다.
carson

1
@Daniel Spiewak : "TEXT와 VARCHAR (MAX)의 기본 차이점은 TEXT 유형은 항상 BLOB에 데이터를 저장하지만 VARCHAR (MAX) 유형은 8k를 초과하지 않는 한 데이터를 행에 직접 저장하려고합니다. 제한하고 그 시점에서 그것을 블롭에 저장합니다. " stackoverflow.com/questions/834788/… 그러나 문제는 MySQL에 관한 것이 었으므로 여기서는 실제로 관련이 없습니다.
Stijn Bollen

9

URL 사용 빈도실제로 길이를 바인딩 해제 해야하는지 여부 에 따라 TEXT 또는 VARCHAR 열 중에서 선택하려고합니다 .

다음 과 같은 경우 micahwittman이 제안한 것처럼 maxlength> = 2,083 인 VARCHAR 을 사용하십시오 .

  1. 쿼리마다 많은 URL을 사용합니다 (TEXT 열과 달리 VARCHAR은 행과 일렬로 저장 됨)
  2. URL이 65,535 바이트의 행 제한을 초과하지 않을 것이라고 확신합니다.

다음과 같은 경우 TEXT를 사용하십시오 .

  1. URL은 실제로 65,535 바이트 행 제한을 초과 할 수 있습니다.
  2. 검색어는 한 번에 (또는 매우 자주) 여러 URL을 선택하거나 업데이트하지 않습니다. TEXT 열은 포인터를 인라인으로 유지하기 때문에 참조 된 데이터 검색과 관련된 임의의 액세스가 어려울 수 있습니다.

9

ASCII 문자 인코딩과 함께 VARCHAR을 사용해야합니다. URL은 퍼센트로 인코딩되며 국제 도메인 이름은 punycode를 사용하므로 ASCII로 저장하기에 충분합니다. 이것은 UTF8보다 훨씬 적은 공간을 사용합니다.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL

5
UTF-8은 필요한 경우에만 더 많은 공간을 사용하지 않습니까?
kommradHomer

7

이것은 실제로 사용 사례에 따라 다르지만 (아래 참조) TEXT성능 문제가있는 상태로 저장하고 VARCHAR대부분의 경우 과잉 소리와 같은 큰 소리를냅니다.

내 접근 방식 :VARCHAR 과 같이 관대하지만 적당하지 않은 길이를 사용 하지 말고 VARCHAR(500)더 큰 URL이 필요한 사용자는와 같은 URL 단축기를 사용하도록 권장하십시오 safe.mn.

트위터 접근 방식 : 정말 멋진 UX를 위해 너무 긴 URL을위한 자동 URL 단축기를 제공하고 링크의 "표시 버전"을 끝에 타원이있는 URL의 스 니펫으로 저장하십시오. (예 : http://stackoverflow.com/q/219569/1235702로 표시되고 stackoverflow.com/q/21956...단축 URL에 연결됨 http://ex.ampl/e1234)

노트와주의 사항

  • 분명히 트위터 접근법은 더 좋지만 내 앱의 요구에 따라 URL 단축기를 권장하는 것으로 충분했습니다.
  • URL 단축기는 보안 문제와 같은 단점이 있습니다. 필자의 경우 URL이 공개적이지 않고 많이 사용되지 않기 때문에 큰 위험이 아닙니다. 그러나 이것은 분명히 모든 사람에게 적용되지는 않습니다. safe.mn은 많은 스팸 및 피싱 URL을 차단하는 것으로 보이지만 여전히주의를 기울이는 것이 좋습니다.
  • 사용자가 URL 단축기를 사용하도록 강요해서는 안됩니다. 대부분의 경우 (적어도 내 응용 프로그램의 요구에 따라) 대부분의 사용자가 사용하는 것에 500 자로 충분합니다. 너무 긴 링크에는 URL 단축기를 사용 / 권장하십시오.

10
내장 URL 단축기를 제공하는 경우 여전히 작동하는 데이터베이스에 전체 길이 URL을 저장하지 않아도됩니까? :-)
Neil Neyman

2
물론이야; 그러나 나는 대부분의 사람들이 자신의 지름길을 쓸지 의심합니다. 이 글을 작성한 이후, URL 단축 API가 많이 있다는 것을 알게 되었으므로 (71은 여기에 나열되어 있습니다 : programmingweb.com/news/… ), 자신도 작성하지 않고도 프로세스를 자동화 할 수 있습니다. 그것은 여전히 ​​사용자의 지식과 동의에 달려 있습니다.
brokethebuildagain



1

대부분의 웹 서버에는 URL 길이 제한 ( "URI가 너무 깁니다"에 대한 오류 코드가 있음)이 있으므로 실제 상위 크기가 있습니다. 가장 많이 사용되는 웹 서버의 기본 길이 제한을 찾아서 가장 큰 것을 필드의 최대 크기로 사용하십시오. 충분해야합니다.


1

(크기 측면에서) 의미 하는 varchar (max) 를 사용하는 것이 좋습니다 varchar (65535). 이렇게하면 더 큰 웹 주소가 저장되고 공간도 절약됩니다.

max 지정자는 varchar, nvarchar 및 varbinary 데이터 형식의 저장 기능을 확장합니다. varchar (max), nvarchar (max) 및 varbinary (max)를 통칭하여 큰 값 데이터 형식이라고합니다. 큰 값의 데이터 형식을 사용하여 최대 2 ^ 31-1 바이트의 데이터를 저장할 수 있습니다.

큰 값의 데이터 형식 사용에 대한 TechNet 의이 기사 를 참조하십시오.


varchar (max)SQLServer 구문이며 MySQL에 적합하지 않습니다 (원래 질문에서와 같이). 또한 varchar (65535)mysql에서 65535가 행의 최대 ASCII 문자 수이므로 다른 필드와 문자 집합에도 의존합니다.
furins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.