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.