【发布时间】:2017-01-12 13:27:25
【问题描述】:
情况:
如果这个问题已经被问过,但解决方案对我不起作用,请提前道歉。
无论我尝试什么,我都无法将表情符号存储在我的数据库中。它们保存为????。
唯一正确保存的表情符号是只需要 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 个)
【问题讨论】:
-
看起来你可能已经读过这个,如果不是在这里:mathiasbynens.be/notes/mysql-utf8mb4。问:您从哪里运行
SHOW VARIABLES ...查询?命令行? PHPMyAdmin?例如,通过 PHPMyAdmin 运行命令可能会产生一些您不期望的值,因为您使用的是 phpmyadmin 连接,因此这些值取决于 phpmyadmin 的连接方式。 -
您好@johnnyfittizio 您在消息字段中使用什么排序规则?
-
@GerardRoche 是的,我在 PHPMyAdmin 中运行它,所以我不应该担心这个结果吗?是的,我已按照该教程进行操作,但不幸的是无法正常工作。
-
看起来服务器配置不正确。我在本地检查,甚至从 PHPMyAdmin 我的配置都是正确的。仔细检查配置,因为您的配置显然不正确。它们应该与文章中的完全一样。调试:确保部分的顺序是
[client]、[mysql]、[mysqld],就像文章中一样(这可能并不重要),确保 mysql 已重新启动(不仅仅是重新加载)。显示数据库结构,它是否具有正确的字符集和排序规则。通过 CLI 尝试SHOW VARIABLES ...查询。 -
是的,一定有什么问题。在 my.cnf 中,我将 character-set-server 设置为 utf8mb4,但是当我检查它时它是 latin1。所以有一些东西可以覆盖它。我会尝试联系服务器。顺便说一句,您知道如何通过 CLI 运行该查询 SHOW VARIABLES 吗?
标签: php android ios mysql codeigniter