문자열로 변환하지 않고 데이터베이스 열을 서명되지 않은 상태에서 이진 상태로 변경
나는 IPv4 주소를 포함한 표를 가지고 있습니다.UNSIGNED INTEGER
기둥.이제 IPv6 주소를 지원하도록 변경합니다.INET6_ATON()
필요한 것은VARBINARY(16)
기둥형.
https://mariadb.com/kb/en/mariadb/inet6_aton/
기존 컬럼을 어떻게 변경하여 내용물을 보존할 수 있습니까?
ALTER TABLE hitcounts CHANGE ip ip BINARY(16);
위 명령어는 서명되지 않은 정수 값을 내가 원하는 것이 아닌 문자열 등가로 변환하는 것 같습니다.
데모
CREATE TEMPORARY TABLE hitcounts (ip INTEGER UNSIGNED);
INSERT INTO hitcounts VALUES (INET_ATON('78.156.181.3')),(INET_ATON('64.255.180.66')),(INET_ATON('31.126.241.81'));
SELECT * FROM hitcounts;
+------------+
| ip |
+------------+
| 1318892803 |
| 1090499650 |
| 528413009 |
+------------+
3 rows in set (0.00 sec)
ALTER TABLE hitcounts MODIFY COLUMN ip VARBINARY(16);
SELECT * FROM hitcounts;
+------------+
| ip |
+------------+
| 1318892803 |
| 1090499650 |
| 528413009 |
+------------+
3 rows in set (0.00 sec)
변환된 IP 값은 보존된 것처럼 보이지만 실제로는 ASCII 문자열로 변환되었습니다(참수일 때 사용된 오른쪽 정렬과 비교하여 세 번째 행의 왼쪽 정렬에 유의하십시오).IP 주소를 가져오지 못합니다.
SELECT INET6_NTOA(ip) FROM hitcounts;
+----------------+
| INET6_NTOA(ip) |
+----------------+
| NULL |
| NULL |
| NULL |
+----------------+
3 rows in set (0.01 sec)
간단한 해결책은 설명된 대로 열을 변경한 다음 INET6_ATON()에서 생성된 이진 문자열로 변환하도록 열을 업데이트하는 것입니다.
UPDATE hitcounts SET ip = INET6_ATON(INET_NTOA(ip));
INET6 기능은 IPv4의 경우 4바이트 바이너리를, IPv6의 경우 16바이트 바이너리를 다루기 때문에, 이것이 '올바른'에 더 가깝다고 생각합니다.
ALTER TABLE hitcounts MODIFY COLUMN ip VARBINARY(16) NOT NULL;
그VAR
이유는INET6_ATON('1.2.3.4')
가 생성됩니다.BINARY(4)
끈을 매다
나는 그것을 단지 변환하는 것을 확인하지 않았습니다.UNSIGNED
로.VARBINARY(16)
는 IPv4 값을 올바르게 보존합니다.
MySQL 5.6.3 또는 MariaDB 10.0.12가 필요합니다.(이전 어느 시점에서는 MariaDB가 다른 철자를 사용하고 있었다고 생각합니다.INET6_NTOP()
그리고.INET6_PTON()
).
언급URL : https://stackoverflow.com/questions/30276018/change-a-database-column-from-unsigned-to-binary-without-converting-to-string
'programing' 카테고리의 다른 글
도커가 내 파일의 압축을 풀지 않음 (0) | 2023.09.19 |
---|---|
"untyped"는 학문적 CS 세계에서 "동적으로 typed"를 의미하기도 합니까? (0) | 2023.09.19 |
메인으로 쓰는 게 어때요? (0) | 2023.09.19 |
무엇인가.무엇인가.XML로?XML로? (0) | 2023.09.14 |
XSLT가 가치가 있습니까? (0) | 2023.09.14 |