Maison > Article > base de données > 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
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>
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)
Méthode 2 : Modifier le jeu de caractères du fichier de configuration de la base de données sur UTF8
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_ciRéécrivez la bibliothèque et la table créées
[root@test ~]# systemctl restart mysqldJetons 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!