Maison  >  Article  >  base de données  >  Comment résoudre le problème des caractères chinois tronqués dans MySQL

Comment résoudre le problème des caractères chinois tronqués dans MySQL

coldplay.xixi
coldplay.xixiavant
2020-07-06 16:20:112715parcourir

Comment résoudre le problème des caractères chinois tronqués dans MySQL

1. MySQL apparaîtra La raison des caractères chinois tronqués
Lorsque nous utilisons la base de données MySQL, nous rencontrons souvent le problème des caractères tronqués. Regardez le code ci-dessous.

    mysql> create table test(id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)

    mysql> insert into test values(1,'宋蔚然');
    ERROR 1366 (HY000): Incorrect string value: '\xE5\xAE\x8B\xE8\x94\x9A...' for column 'name' at row 1
    mysql>

Recommandations d'apprentissage associées : Tutoriel vidéo mysql

Évidemment, lors de l'insertion du chinois, une erreur est signalée. Quelle est la raison ?

    mysql> show variables like '%CHARACTER%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

character_set_client L'encodage des caractères utilisé par le client
character_set_connection L'encodage utilisé par le lien de la base de données
character_set_database L'encodage des caractères utilisé par la base de données
Il s'avère que l'encodage des caractères n'est pas unifié avec l'encodage du serveur et de la base de données.

2. Solution aux caractères chinois tronqués dans MySQL
Méthode 1 : Définir les noms

    mysql> set names latin1;
    
    mysql> set names latin1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from test;
    Empty set (0.00 sec)
    
    mysql> insert into test values(1,'宋蔚然');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 宋蔚然    |
    +------+-----------+
    1 row in set (0.00 sec)

Reviens Jetez un œil aux paramètres du jeu de caractères

     mysql> show variables like '%CHARACTER%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

Si le codage des caractères est unifié, il n'y aura pas de caractères tronqués.
Résoudre le problème des caractères tronqués consiste en fait à unifier l'encodage des caractères du client avec l'encodage du serveur et de la base de données. Les encodages du serveur et de la base de données ici sont latin1, et tous les noms définis latin1 peuvent résoudre temporairement le problème tronqué.

Méthode 2 : Modifier le jeu de caractères du fichier de configuration de la base de données sur UTF8
UTF8 prend en charge de nombreux systèmes linguistiques, il est donc fortement recommandé de définir le codage des caractères sur UTF8 en production. Ouvrez le fichier de configuration de la base de données et ajoutez le contenu suivant sous [client], [mysql] et [mysqld] respectivement.

    #vi /mysql/data/3306/my.cnf
    
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci

Redémarrer la base de données

   [root@test ~]# systemctl restart mysqld

Créer la bibliothèque et la table de création

    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use test;
    Database changed
    mysql> create table test(id int,name varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into test values(1,'宋蔚然');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from test;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 宋蔚然    |
    +------+-----------+
    1 row in set (0.00 sec)

Jetons un coup d'œil aux paramètres du jeu de caractères

🎜

1. La raison pour laquelle les caractères chinois tronqués apparaissent dans MySQL

Lorsque nous utilisons le Base de données MySQL, nous rencontrons souvent des caractères tronqués. Question, regardez le code ci-dessous.

    mysql> show variables like '%CHARACTER%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

Évidemment, une erreur est signalée lors de l'insertion de caractères chinois. Quelle en est la raison ?

    mysql> create table test(id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)

    mysql> insert into test values(1,'宋蔚然');
    ERROR 1366 (HY000): Incorrect string value: '\xE5\xAE\x8B\xE8\x94\x9A...' for column 'name' at row 1
    mysql>

character_set_client L'encodage des caractères utilisé par le client
character_set_connection L'encodage utilisé par le lien de la base de données
character_set_database L'encodage des caractères utilisé par la base de données

Il s'avère que l'encodage des caractères n'est pas unifié avec l'encodage du serveur et de la base de données.

2. Solution aux caractères chinois tronqués dans MySQL
Méthode 1 : Définir les noms

    mysql> show variables like '%CHARACTER%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

Reviens Jetez un œil aux paramètres du jeu de caractères

    mysql> set names latin1;
    
    mysql> set names latin1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from test;
    Empty set (0.00 sec)
    
    mysql> insert into test values(1,'宋蔚然');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from test;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 宋蔚然    |
    +------+-----------+
    1 row in set (0.00 sec)

Si le codage des caractères est unifié, il n'y aura pas de caractères tronqués.

Résoudre le problème des caractères tronqués consiste en fait à unifier l'encodage des caractères du client avec l'encodage du serveur et de la base de données. Les encodages du serveur et de la base de données ici sont latin1, et définir tous les noms latin1 peut résoudre temporairement le problème tronqué.

Méthode 2 : Modifier le jeu de caractères du fichier de configuration de la base de données sur UTF8

UTF8 prend en charge de nombreux systèmes linguistiques, il est donc fortement recommandé de définir le codage des caractères sur UTF8 en production. Ouvrez le fichier de configuration de la base de données et ajoutez le contenu suivant sous [client], [mysql] et [mysqld] respectivement.

     mysql> show variables like '%CHARACTER%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

Redémarrez la base de données

    #vi /mysql/data/3306/my.cnf
    
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci

Réécrivez la bibliothèque et la table créées

   [root@test ~]# systemctl restart mysqld

Jetons un coup d'œil aux paramètres du jeu de caractères
    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use test;
    Database changed
    mysql> create table test(id int,name varchar(10));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into test values(1,'宋蔚然');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from test;
    +------+-----------+
    | id   | name      |
    +------+-----------+
    |    1 | 宋蔚然    |
    +------+-----------+
    1 row in set (0.00 sec)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer