无法在数据库中存储表情符号。
无法在数据库中存储表情符号。
情况:
抱歉,如果这个问题已经被问过了,但是解决方法对我不起作用。
无论我尝试什么,我都无法在我的数据库中保存表情符号。它们保存为 ????
。
唯一能正确保存的表情符号是只需要3个字节的表情,比如害羞的表情或太阳的表情。
实际的 utf8mb4 没有起作用。
已在 Android 和 Ios 上进行了测试,结果相同。
版本:
Mysql: 5.5.49
CodeIgniter: 3.0.0
步骤:
- 我已修改了数据库的字符集和校对规则属性。
ALTER DATABASE my_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
- 我已修改了表的字符集和校对规则属性。
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
- 我已尽可能地将表中的每个字段设置为编码:
UTF-8(ut8mb4)
和校对规则:utf8mb4_unicode_ci
- 我已修改了 CodeIgniter 应用程序中的数据库连接。
- 我已运行以下命令:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
- 最后我也尝试了这个:
REPAIR TABLE table_name; OPTIMIZE TABLE table_name;
一切都应该正确设置,但是仍然不起作用。
数据库设置:
以下是运行以下命令后的结果:
`SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';`
表设置:
表结构的截图:
数据库连接:
这些是 database.php 中的数据库连接设置(请注意,这不是唯一的数据库,还有其他使用 utf8 连接的数据库)
$db['my_database'] = array( 'dsn' => '', 'hostname' => PROJECT_DATABASE_HOSTNAME, 'username' => PROJECT_DATABASE_USERNAME, 'password' => PROJECT_DATABASE_PASSWORD, 'database' => PROJECT_DATABASE_NAME, 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8mb4', 'dbcollat' => 'utf8mb4_unicode_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
MY.CNF 设置:
这是 my.cnf 文件的全部内容:
[mysqld]
default-storage-engine=MyISAM
innodb_file_per_table=1
max_allowed_packet=268435456
open_files_limit=10000
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
问题:
你知道为什么不起作用吗?我漏掉了什么吗?
假设 1:
我不确定,但问题的原因可能是这个:
如你所见,在 my.cnf 中,character-set-server
明确设置为 utf8mb4
:
但是在数据库中运行以下查询后:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
结果是 character-set-server = latin1
你知道为什么吗?为什么实际上没有更新呢?
假设 2:
应用程序使用多个不同的数据库。
其中一个设置为 utf8mb4,但其他所有数据库都设置为 utf8。即使它们是分开的数据库,这可能会有问题吗?
谢谢!
编辑:
这是运行 SHOW CREATE TABLE app_messages;
的结果:
CREATE TABLE `app_messages` ( `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `project_id` bigint(20) NOT NULL, `sender_id` bigint(20) NOT NULL, `receiver_id` bigint(20) NOT NULL, `message` text COLLATE utf8mb4_unicode_ci, `timestamp` bigint(20) DEFAULT NULL, `is_read` enum('x','') COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`message_id`) ) ENGINE=InnoDB AUTO_INCREMENT=496 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
编辑 2:
我运行了以下命令:
INSERT INTO app_messages (message_id, project_id, sender_id, receiver_id, message, timestamp, is_read) VALUES ('496','322','77','188', '' ,'1473413606','x');
还有另外两个类似的命令,分别是和
它们都成功插入到表中:
但在实际应用程序中,我看到的是:?
(这次只有一个?而不是4个)
问题出现的原因:
在MySQL数据库中,无法存储和处理emoji表情符号。这是因为MySQL默认的字符集和排序规则不支持存储和处理这些特殊字符。
解决方法:
通过修改MySQL的配置文件来支持存储和处理emoji表情符号。具体步骤如下:
1. 打开MySQL的配置文件my.cnf
。
2. 创建一个自定义的配置文件,如conf.d/90-my.cnf
。
3. 在该文件中添加以下配置内容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
4. 保存并关闭配置文件。
5. 重新加载配置文件,使新的配置生效。
6. 重新启动MySQL服务。
通过以上步骤,我们对MySQL进行了配置,使其能够正确存储和处理emoji表情符号。现在,我们可以在数据库中存储和操作这些特殊字符了。
问题的原因是数据库中的列没有声明为utf8mb4字符集,解决方法是修改列的字符集为utf8mb4。
文章内容如下:
在数据库中存储表情符号(emoji)时,如果出现????
的情况,通常是因为该列没有声明为utf8mb4
字符集。尽管你可能已经确认了该列的字符集声明方式,但请运行SHOW CREATE TABLE table_name;
来进一步确认。
系统默认字符集、数据库默认字符集和表默认字符集在列的字符集声明方式下是无关紧要的。
需要注意的是,在回答其他问题时,字符集排序是无关紧要的,只有字符集声明对于这个问题是相关的。
感谢回复。我已经编辑了问题,并包含了运行SHOW CREATE TABLE
的结果,这样正确吗?
CREATE TABLE
看起来是正确的。下一步是检查SELECT message, HEX(message) ...
以查看问号的十六进制表示形式。我预计会看到3F3F3F3F
表示????
,这意味着问题发生在插入操作期间。
是什么在创建这些表情符号?在插入之前的某个地方出现了????
吗?有没有办法重新运行插入操作,以便在插入之前查看十六进制表示形式?
谢谢,我已经编辑了问题,并添加了一部分在表中插入一些表情符号的内容,但现在显示(从表中取出)不正确。但是,很抱歉我不知道如何正确运行HEX
,它不起作用。
问题的出现原因是配置了CodeIgniter数据库时,char_set和collation没有正确设置。在message_save函数中,原本设置了一个名为$project_db_config的数组来配置数据库连接信息,但是在后面的代码中又使用了一个名为$mobile_db的连接来保存消息,这导致了数据库连接设置不正确。
解决方法是将message_save函数中的数据库连接设置改为正确的连接。将$project_db_config的使用改为$mobile_db_connection,并确保api正确设置char_set为utf8mb4和db_collat为utf8mb4_unicode_ci。
总结起来,问题的根源在于数据库连接没有正确设置。即使数据库本身已经正确配置,如果应用程序没有正确连接到数据库,也无法正常工作。因此,如果遇到类似的问题,要确保api正确设置char_set为utf8mb4和db_collat为utf8mb4_unicode_ci。