programing

문자열로 변환하지 않고 데이터베이스 열을 서명되지 않은 상태에서 이진 상태로 변경

codeshow 2023. 9. 19. 21:29
반응형

문자열로 변환하지 않고 데이터베이스 열을 서명되지 않은 상태에서 이진 상태로 변경

나는 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

반응형