source

마리아의 문자를 사용한 이진 데이터 형식 조합DB

lovecheck 2023. 8. 10. 18:54
반응형

마리아의 문자를 사용한 이진 데이터 형식 조합DB

저는 RDBMS에 대해 깊이 이해하기 위해 노력하고 있으며, MariaDB를 배우고 있습니다.

이진 데이터 유형과 데이터 정렬 방식을 가져오는 데 어려움을 겪고 있습니다.

이진(n) 데이터 유형에 n바이트가 소요되는 것으로 알고 있습니다.이것은 할당할 수 있는 가장 작은 메모리가 1바이트라는 것을 의미합니까?

이것은 MariaDB 설명서에서 가져온 것입니다.

BINARY 유형은 CHAR 유형과 비슷하지만 이진이 아닌 문자열 대신 이진 바이트 문자열을 저장합니다.M은 열 길이를 바이트 단위로 나타냅니다.문자 집합이 없으며 비교 및 정렬은 바이트의 숫자 값을 기반으로 합니다.

다음과 같은 하위 질문이 있습니다.

  1. 바이트의 숫자 값은 정확히 무엇입니까?ASCII 문자가 숫자를 얻는 것과 같습니까?그렇지 않은 경우 숫자 값은 어떻게 결정됩니까?
  2. 만약 내가 이진 데이터 유형 안에 'A' 문자를 삽입한다면, 이것은 어떻게 인코딩되고 저장됩니까?Table plus 클라이언트에서는 이진 파일로 저장되는 것을 볼 수 없습니다.
  3. 예를 들어 동일한 데이터 유형에서 문자를 추가할 수 있고 이진 이미지도 추가할 수 있습니다. 바이트 문자열의 숫자 값은 어떻게 결정됩니까?

이것을 테스트하기 위해 몇 개의 테이블을 만들었습니다.

먼저 이진(1)으로 테스트하기 위해 테이블을 만듭니다. 이것은 1자리 0-9 또는 1자 이상의 A-Z 또는 a-z를 추가할 수 없습니다.

그런 다음 Binary(10)로 테이블을 만들어 정렬 순서가 어떻게 작동하는지 확인했습니다.

CREATE TABLE BinaryEg1(
    b BINARY(1)
);

-- Adding two binary digits
INSERT INTO BinaryEg1 VALUES (0), (1);


-- Throws error, too long
INSERT INTO BinaryEg1 VALUES (10);


-- Adding basic chars to compare sort
INSERT INTO BinaryEg1 VALUES ('A'), ('a'), ('B'), ('b');

여기서 기본 정렬 순서를 보면 대문자 앞에 숫자를 배치하고 그 다음에 소문자를 배치합니다.

SELECT * FROM BinaryEg1 ORDER BY b;

Binary(1) column sort

-- Creating a table of 10 binary bytes to test how sorting works
CREATE TABLE BinaryEg10(
    b BINARY(10)
);

-- Inserting values into 10 byte binary column
INSERT INTO BinaryEg10 VALUES (HEX('A'));

-- Adding some numbers of varying lengths to test sort order
INSERT INTO BinaryEg10 VALUES
(110),
(44),
(999999),
(1111111111),
(7876);

SELECT * FROM BinaryEg10 ORDER BY b;

이제 정렬 순서가 표시됩니다.

Binary(10) sort

누가 정렬이 어떻게 작동하는지 설명해 주세요. 첫 번째 바이트가 순서에서 가장 중요한 것 같습니다. 나머지 바이트는 무시하고,

이해합니다. 일반적으로 문자를 저장하는 데 이진법을 사용하면 안 된다고 생각하기 때문에 무관하고 무의미한 질문일 수도 있지만, 그래도 이 데이터 유형이 어떻게 작동하는지에 대해 확실하게 이해하고 싶습니다.

위의 질문에 대한 코멘트 덕분에 16진수 값을 얻을 수 있다는 아이디어를 얻었습니다.이제, 저는 이것이 어떻게 작동하는지에 대해 깊이 이해했습니다.

정답:

바이트의 숫자 값은 정확히 무엇입니까?ASCII 문자가 숫자를 얻는 것과 같습니까?그렇지 않은 경우 숫자 값은 어떻게 결정됩니까?

바이트 시퀀스의 각 바이트, 각 바이트는 0-255 기본 10의 숫자입니다. 각 바이트에는 8비트가 있기 때문입니다.

ASCII 문자를 추가하면 숫자 값이 16진수 숫자 코드에 매핑되고 10진수 숫자 코드에 매핑됩니다.ASCII 문자의 경우 숫자 코드와 숫자 값이 동일합니다.

만약 내가 이진 데이터 유형 안에 'A' 문자를 삽입한다면, 이것은 어떻게 인코딩되고 저장됩니까?Table plus 클라이언트에서는 이진 파일로 저장되는 것을 볼 수 없습니다.

문자 'A'를 이진 열에 삽입하면 1바이트의 메모리가 필요하며, 문자 'A'를 문자 열에 추가한 경우와 같습니다.

MariaDB의 기본 문자 집합인 Latin1 문자 집합의 Decimal/hex 값을 기준으로 이진으로 인코딩됩니다.이것은 ASCII 및 유니코드 테이블에 매핑되므로 동일합니다.

문자 'A'의 16진수 값은 41입니다.이진으로 변환되면 01000001로 저장되며 메모리 바이트가 필요합니다.십진수 값은 65입니다.이 문자를 다른 행의 다른 값과 비교하는 경우 비교는 이 숫자 값을 기반으로 하며 문자를 사용하는 것과 같은 조합이 아닙니다.

예를 들어 동일한 데이터 유형에서 문자를 추가할 수 있고 이진 이미지도 추가할 수 있습니다. 바이트 문자열의 숫자 값은 어떻게 결정됩니까?

이진 데이터 유형을 바이트 시퀀스로 이해하고 개념화하는 것이 중요합니다.각 바이트에는 0에서 255까지의 숫자 값이 있습니다.

이 비교는 왼쪽에서 오른쪽으로 작업하는 각 바이트의 숫자 값을 비교합니다.바이트가 같으면 다음 바이트 집합의 바이트 값 등을 비교합니다.

다음은 이를 보여주는 몇 가지 예입니다.

-- Creating a table with just 1 byte
CREATE TABLE BinaryEg1(
    b BINARY
);

-- Inserting values:
INSERT INTO BinaryEg1 VALUES (0), (1), ('A'), ('B'), ('a'), ('b'), (0);

이제 두 개의 열을 만들었습니다. 하나는 정규 값이고 다른 하나는 16진수 값입니다. 숫자 값이 ASCII, Latin1, UTF8 문자 집합에 있는 숫자 코드에 더해진 것을 볼 수 있습니다.

SELECT b, HEX(b) FROM BinaryEg1 ORDER BY b;

Binary column with hex value sorted:

세 개의 열로 동일한 점을 표시하는 또 다른 예제를 작성하고 열이 동일한 방식으로 정렬되는 방법을 확인할 수 있습니다.

CREATE TABLE BinaryEg3(
    b BINARY(3)
);

INSERT INTO BinaryEg3 VALUES 
(418), (518), (318);
(320), (319), (317);

이제 일반적인 십진수 문자와 16진수 값을 확인할 수 있습니다. 그러면 정렬 방법을 알 수 있습니다.

SELECT b, HEX(b) FROM BinaryEg3 ORDER BY b;

Hex values for sequence of 3 bytes

이제 이러한 값은 16진수를 기준으로 이진수로 저장됩니다.각 바이트는 2개의 16진수를 가지므로 3자리는 6개의 16진수를 가집니다.

각 바이트는 해당 숫자 값을 기준으로 비교되기 때문에 317은 318 앞에, 318은 319 앞에 옵니다.

3과 1의 16진수/이진값은 같지만 7 < 8 < 9

언급URL : https://stackoverflow.com/questions/75924216/binary-data-type-collation-with-characters-in-mariadb

반응형