J'essaie de sauvegarder les noms des utilisateurs d'un service dans ma base de données MySQL. Ces noms peuvent contenir des emojis comme (juste pour des exemples)MySQL utf8mb4, Erreurs lors de la sauvegarde des Emojis
Après une recherche un peu j'ai trouvé ce stackoverflow liant à ce tutorial. J'ai suivi les étapes et il semble que tout est configuré correctement.
J'ai une base de données (charset et collation définie sur utf8mb4 (_unicode_ci)), une table appelée TestTable, également configurée de cette façon, ainsi qu'une colonne "Text" configurée de cette façon (VARCHAR (191) utf8mb4_unicode_ci).
Lorsque je tente de sauver emojis je reçois une erreur:
Example of error for shortcake():
Warning: #1300 Invalid utf8 character string: 'F09F8D'
Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1
Le seul Emoji que j'ai pu sauver bien le soleil était ☀️
Bien que je n'ai pas essayé tous pour être honnête.
Y at-il quelque chose qui me manque dans la configuration?
Veuillez noter: Tous les tests de sauvegarde n'impliquaient pas un côté client. J'utilise phpmyadmin pour changer manuellement les valeurs et sauvegarder les données. Donc, la configuration correcte du côté client est quelque chose que je vais prendre en charge après le serveur enregistre correctement emojis.
Une autre Sidenote: Actuellement, lors de l'enregistrement emojis je soit obtenir l'erreur comme ci-dessus, ou aucune erreur et les données de Username
seront stockées sous forme Username ????
. Erreur ou aucune erreur dépend de la façon dont je sauvegarde. Lors de la création/sauvegarde via SQL Statement je sauvegarde avec des points d'interrogation, lors de l'édition en ligne je sauvegarde avec des points d'interrogation, lors de l'édition en utilisant le bouton d'édition je reçois l'erreur.
merci
EDIT 1: D'accord, donc je pense que je trouve le problème, mais pas la solution. Il semble que les variables spécifiques à la base de données n'ont pas changé correctement.
Quand je suis connecté en tant que root sur mon serveur et lu les variables (globales):
requête utilisée: SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name 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 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
Pour ma base de données (dans phpmyadmin, la même requête) il semble comme le suivant:
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
Comment puis-je ajuster ces paramètres sur la base de données spécifique? Même si j'ai les premiers paramètres affichés par défaut, lors de la création d'une nouvelle base de données, je reçois le second en tant que paramètres.
** Edit 2: ""
Voici mon fichier my.cnf
:
[client]
port=3306
socket=/var/run/mysqld/mysqld.sock
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql
log_error=/var/log/mysql/error.log
max_connections=200
max_user_connections=30
wait_timeout=30
interactive_timeout=50
long_query_time=5
innodb_file_per_table
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
!includedir /etc/mysql/conf.d/
C'est un problème de phpmyadmin, essayez d'autres clients mysql. – jsxqf
Je ne pense pas que ce soit un problème de phpmyadmin. Comme vous pouvez le voir dans Edit1, je pense qu'il y a une mauvaise configuration entre les variables/paramètres conf/default et ceux de la base de données. Même si lors de la création d'une nouvelle base de données. – Loki
Qu'est-ce que '$ cfg [" DefaultCharset "]' dans votre configuration PMA? – miken32