라는 제목의 테이블을 가정 '거래'MySQL의 Regex on IP 숫자 값은 무엇입니까?
일반적인 쿼리 : 나는 특정 첫번째 옥텟 (예 : 127)로 모든 IP의에 대한 정규식 검색을 수행 할 수있는 능력을 원하는 select * from transactions where ip=INET_ATON('127.0.0.1');
그러나 나는 확실히 알아낼 수 없습니다 신택스.
감사합니다.
라는 제목의 테이블을 가정 '거래'MySQL의 Regex on IP 숫자 값은 무엇입니까?
일반적인 쿼리 : 나는 특정 첫번째 옥텟 (예 : 127)로 모든 IP의에 대한 정규식 검색을 수행 할 수있는 능력을 원하는 select * from transactions where ip=INET_ATON('127.0.0.1');
그러나 나는 확실히 알아낼 수 없습니다 신택스.
감사합니다.
이와같이?
select * from transactions where ip REGEXP "^[1-2][1-9][1-9]"
주소의 숫자 값의 처음 3 자리 숫자는 점으로 된 쿼드 표현과 같지 않습니까? –
SELECT * FROM transactions WHERE ip LIKE '127.%';
당신은 IP는 32 비트 정수는 것을 의미한다 INET_ATON의 결과에 IP를 비교한다. 당신의 작업은 ... 간단해야
SELECT * FROM transactions WHERE (longip & 0xFF000000) = (0x7F000000)
이 훨씬 문자열에서 점선 IP에 정규식을 적용하는 것보다 더 빨리, 그리고 LIKE '127 %'솔루션보다 빨라집니다.
좋은 답변입니다! 당신 (잘 ... 나는) IP 주소가 때로는 하나의 번호 일 뿐이라는 것을 잊어 버리는 경향이 있습니다 ... – nickf
'transactions.ip'는 이미 정수이므로 질문자가 INT_ATON을 사용하는 이유입니다. 이것은 (인덱스를 격파) 전체 테이블 스캔을 필요로
SELECT * FROM transactions WHERE INT_NTOA(ip) LIKE '127.%';
: 그것은 정규 표현식/같은 문자열에 대해 직접 일치하도록 노력하고 좋은 없습니다, 먼저 역 기능 INT_NTOA를 사용하여 IPv4 주소로 다시 변환해야 변환하고 비교할 수 있습니다.
나는 당신이 IP의 앞 부분에 대해 비교하려는 경우,
그러나 (예 : 127) 특정 첫번째 옥텟으로 모든 IP의에 대한 정규식 검색을 할 수있는 능력을 원한다 주소, 당신은 첫 번째 8 진수는 숫자의 최상위 비트에 저장된다는 사실을 이용할 수 있고, 말 : 'IP'에 인덱스를 사용하여 수행 할 수 있습니다
SELECT * FROM transactions WHERE ip BETWEEN INT_NTOA('127.0.0.0') AND INT_NTOA('127.255.255.255');
그렇게 될 수 상당히 실력 있는.
굉장! 감사! –
너무 늦었거나 다른 사람의 스키마 일 수 있지만 문자열로 저장된 IP 주소는 사용하기가 어렵습니다. 네 개의 TINYINT 열은 작업하기가 훨씬 쉽습니다. 다음은 자세한 내용을 담은 좋은 기사입니다 : http://sqlserver2000.databases.aspfaq.com/how-should-i-store-an-ip-address-in-sql-server.html – NitroxDM