programing

MariaDB 클라이언트가 utf8mb4를 사용하도록 강제 설정

javaba 2022. 11. 26. 21:41
반응형

MariaDB 클라이언트가 utf8mb4를 사용하도록 강제 설정

PHP Version 명령줄을 사용하여 쿼리할 때 다른 순서로 결과를 얻는 문제가 발생했습니다.제가 조사한 바로는 잘못된 인코딩으로 인해 결과 순서에 문제가 생길 수 있는 경우가 있는 것 같습니다.

은 ,, 든 DB 음 음 、 음 음 、 음 、 음음 as as as as as 。utf8mb4에서는, 「」를 참조해 주세요utf8mb4_general_ci그러나 mysql 변수가 올바르게 설정되어 있지 않은 것 같습니다.

저는 Mysql 5.5.5-10.1.26-MariaDb에 있습니다.

CNF 설정은 다음과 같습니다만, 솔직히 여기서 무엇을 하고 있는지 모르겠습니다.

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mariadb]


[mysqld]

character-set-server=utf8mb4
character_set_client=utf8mb4
collation-server=utf8mb4_general_ci

mysql에서 출력되는 변수는 다음과 같습니다.

character_set_client        utf8
character_set_connection    utf8
character_set_database      utf8mb4
character_set_filesystem    binary
character_set_results       utf8
character_set_server        utf8mb4
character_set_system        utf8
collation_connection        utf8_general_ci
collation_database          utf8mb4_unicode_ci
collation_server            utf8mb4_general_ci

업데이트: 다른 사용자가 데이터베이스 연결 방법을 요청했습니다.

$this->connection = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';port='.DB_PORT, DB_USER, DB_PASS, $options);

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★utf8mb4_unicode_ci(미국의)

또한 character-set-client-files = FALSE도 원합니다.

★★★★★★★★★★★★★★★★ /etc/my.cnf.d/character-set.cnf

# https://scottlinux.com/2017/03/04/mysql-mariadb-set-character-set-and-collation-to-utf8/
# https://mariadb.com/kb/en/library/setting-character-sets-and-collations/
# https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434
# https://stackoverflow.com/questions/47566730/force-mariadb-clients-to-use-utf8mb4

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
character-set-server = utf8mb4

나는 모든 것을 utf8mb4로1 받는다.

MariaDB [(none)]> show variables like 'char%'; show variables like 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]>

단, character-set-client-contains 행이 없으면 utf8인 경우도 있습니다.

MariaDB [(none)]> show variables like 'char%'; show variables like 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)

MariaDB [(none)]>

1 character_set_system은 항상 utf8 입니다.

정확도가 높기 때문에 utf8mb4_general_ci 대신 utf8mb4_unicode_ci를 사용해야 합니다.오래된 CPU 또는 제한된 CPU를 탑재한 시스템에서 MariaDB를 실행하고 있는 경우 이외에는 퍼포먼스가 큰 문제가 됩니다.

즉, 솔루션은 MariaDB 구성으로 설정하는 것입니다(또는--init-connect령령:::::::) :

init_connect = "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

어느 쪽이든 좋습니다.나는 다른 방법보다 한 가지 방법을 추천하는 것이 아니다.둘 다 똑같이 유효한 접근법입니다.

MariaDB my.cnf my.cnf my.cnf my.cnf my.cnf my.cnf / etc / mysql 。상세한 것에 대하여는, 시스템의 메뉴얼을 참조해 주세요.위에 링크된 MariaDB 설명서에 나타나 있듯이 서버 변수를 설정하기 때문에 설정 파일의 서버 부분에서 변수를 설정해야 합니다.구성 파일의 서버 부분은 "d"로 끝나는 INI 섹션 이름으로 표시됩니다.INI 섹션은 각 괄호로 둘러싸인 키워드(예: "섹션")로 표시됩니다.의 표준 UNIX 인 ".는 '에서 설정할 수 .[mysqld] 또는 「」의 어느쪽인가를 나타냅니다.[mariadb]★★★★★★★★★★★★★★★★★★★★★★★.init_connect 모두에서 MariaDB 아래에 둘 합니다.아래에 배치하는 것을 추천합니다.[mysqld].

설정 중임을 알 수 있습니다.character_set_client=utf8mb4를 참조해 주세요.당신은 이렇게 할 필요가 없다.회선을 삭제하거나 코멘트 아웃 할 수 있습니다.주석은 파운드 기호로 시작하는 선입니다(#)는 해시 마크, 옥토소프 또는 숫자 기호라고도 합니다.

서버에 접속하는 모든 클라이언트는 다른 명령어가 처리되기 전에 이들 명령어를 실행합니다.

init_connect로서 접속하고 있는 누구에 의해서도 행해지지 않는다.root그래서 당신이 원하는 만큼 보편적이지 않다.

SET NAMES utf8mb4세 가지를 설정한다; 그것을 보기 위해 실험한다.3개 다 필요해요.

5.5까지 거슬러 올라가지 않았다면utf8mb4_unicode_520_ci더 나은 조합으로: "유니코드 조합 이름에는 조합의 기반이 되는 Unicode Collation Algorithm(UCA; 유니코드 조합 알고리즘) 버전을 나타내는 버전 번호가 포함될 수 있습니다.이렇게 작성된 초기 대조에서는 버전 UCA 5.2.0을 사용합니다.예를 들어 utf8_unicode_520_ci는 UCA 5.2.0을 기반으로 합니다.UCA 기반의 Unicode 조합명은 버전 번호를 포함하지 않습니다.버전 4.0.0을 기반으로 합니다."

버전 8.0에는 Unicode 9.0 표준이 있습니다.

질문으로 돌아가다:완벽한 해결책은 없습니다.사용자는 무지를 통해서든 악의를 통해서든 당신이 하는 모든 것을 무시할 수 있습니다.

작성된 테이블을 폴리싱할 수 있지만, 이렇게 해도 테이블이 잘못 연결되어 있는 것을 막을 수는 없습니다.아니면 맞지만, 다른 문자 집합으로요.하는 것은 유효하다SET NAMES latin1latin1~latin1-bytes를 MySQL/MySQL을 사용합니다.

, ", utf8"이라고 하면SET NAMES latin1 부호화'이중 부호화', '이중 부호화', '이중 부호화', '이중 부호화', '이중 부호화', '이중 부호화'가 됩니다.이 "버그"는 올바르게 대조할 가능성을 모두 파괴하지만, 그 외에는 (통상) 투명합니다. 시 이 흐트러지고 시 버립니다.

이 경고를 수정하려면

/etc/my.cnf (my.ini on Windows)

파일 추가/설정만 하면 됩니다.

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
collation-server=utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4

언급URL : https://stackoverflow.com/questions/47566730/force-mariadb-clients-to-use-utf8mb4

반응형