J'utilise le caractère Emoji dans mon projet. Ces caractères sont sauvegardés (??) dans la base de données mysql. J'avais utilisé le classement par défaut de la base de données dans utf8mb4_general_ci
. Cela montre
1366 Valeur de chaîne incorrecte: '\ xF0\x9F\x98\x83\xF0\x9F ...' pour la colonne 'commentaire' à la ligne 1
1) Base de données: modifiez le classement par défaut de la base de données sous la forme utf8mb4
.
2) Table: modifiez le classement de la table en tant que CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
.
Requete:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Code:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh????????????????hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')
4) Définissez utf8mb4
dans la connexion à la base de données:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');
étape 1, modifiez le jeu de caractères par défaut de votre base de données:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
étape 2, définissez charset lors de la création de la table:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
ou alter table
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
Si vous utilisez Solr + Mysql + Java, vous pouvez utiliser:
Cela peut être utilisé:
Dans le cas ci-dessus, c'est l'une des solutions pour stocker vos émoticônes dans votre système.
Étapes pour l'utiliser:
Bibliothèque utilisée: import Java.net.URLDecoder; importer Java.net.URLEncoder;
Exemple de code:
import Java.net.URLDecoder;
import Java.net.URLEncoder;
public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("????????????????????????????????????????????????????3⃣5⃣3⃣‼〽➗➗????????????????♋♍♋♍⬅⬆⬅⬅???????????????????????????????????????? "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}
public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
J'ai mis à jour ma base de données et ma table pour passer de tf8 à tf8mb4. Mais rien ne fonctionne pour moi. Ensuite, j'ai essayé de mettre à jour le type de données de la colonne sur blob, heureusement, cela a fonctionné pour moi et les données ont été enregistrées. Même ma base de données et ma table sont CHARACTER SET utf8 COLLATE utf8_unicode
Les bases de données et les tables doivent avoir le jeu de caractères utf8mb4
et la collation utf8mb4_unicode_ci
.
Lorsque vous créez une nouvelle base de données , vous devez utiliser:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Si vous avez une base de données existante et que vous souhaitez ajouter un support:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Vous devez également définir le bon jeu de caractères et le bon classement pour vos tables:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
ou changez-le si vous avez des tables existantes avec beaucoup de données:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Notez que utf8_general_ci
n'est plus une pratique recommandée. Voir le Q & A connexe:
Quelle est la différence entre utf8_general_ci et utf8_unicode_ci sur Stack Overflow.
Ma réponse ne fait qu'ajouter à la réponse de Selvamani P.
Vous devrez peut-être également modifier les requêtes SET NAMES utf8
avec SET NAMES utf8mb4
. Cela a fait le tour pour moi.
En outre, ceci est un excellent article pour porter votre site Web de utf8 à utf8mb4. En particulier, l'article fait deux bons points sur les index et la réparation des tables après les avoir converties en utf8mb4:
INDEX
Lors de la conversion d'utf8 en utf8mb4, la longueur maximale d'une clé de colonne ou d'index n'est pas modifiée en termes d'octets. Par conséquent, il est plus petit en termes de caractères, car la longueur maximale d'un caractère est maintenant de quatre octets au lieu de trois. [...] Le moteur de stockage InnoDB a une longueur d'index maximale de 767 octets. Par conséquent, pour les colonnes utf8 ou utf8mb4, vous pouvez indexer un maximum de 255 ou 191 caractères, respectivement. Si vous avez actuellement des colonnes utf8 avec des index de plus de 191 caractères, vous devrez indexer un nombre de caractères plus petit lorsque vous utilisez utf8mb4.
TABLES DE REPARATION
Après avoir mis à niveau le serveur MySQL et apporté les modifications nécessaires décrites ci-dessus, veillez à réparer et à optimiser toutes les bases de données et tables. Je ne l'ai pas fait tout de suite après la mise à niveau (je ne pensais pas que c'était nécessaire, car tout semblait bien fonctionner à première vue), et j'ai rencontré quelques bugs étranges où les déclarations UPDATE n'avaient aucun effet, même si aucun des erreurs ont été jetées.
En savoir plus sur les requêtes pour réparer les tables de l'article.
La commande pour modifier la colonne est:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
Et nous devons utiliser type = BLOB
Exemple à modifier est comme ci-dessous: -
ALTER TABLE messages MODIFY content BLOB;
J'ai vérifié que les dernières bases de données MySQL et autres n'ont pas besoin de ''
pour pouvoir être utilisé dans la commande nom_table, nom_colonne, etc.
Extraire et enregistrer les données: Enregistrez directement le contenu du chat dans la colonne et pour extraire les données, extrayez les données sous forme de tableau d'octets (byte[])
à partir de la colonne de base de données, puis convertissez-le en string
par exemple. (Code Java)
new String((byte[]) arr)
Le point principal n’a pas été mentionné dans les réponses ci-dessus:
Nous devons passer la chaîne de requête avec les options "useUnicode=yes"
et "characterEncoding=UTF-8"
dans la chaîne de connexion
Quelque chose comme ça
_mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
_
Eh bien, vous n’avez pas besoin de changer le Charset Whole DB. Au lieu de cela, vous pouvez le faire en changeant la colonne en blob type.
Messages ALTER TABLE MODIFY contenu BLOB;