无法在数据库中存储表情符号

Fra*_*ssi 19 php mysql android codeigniter ios

情况:

如果已经提出这个问题,请提前抱歉,但解决方案对我不起作用.

无论我尝试什么,我都不能将表情符号存储在我的数据库中.他们被保存为????.
正确保存的唯一表情符号只需要3个字节,如害羞的脸或太阳.

实际的utf8mb4无效.

数据库截图

它已经在Android和Ios上进行了测试.结果相同.

版本:

Mysql:5.5.49
CodeIgniter:3.0.0

步骤:

  1. 我修改了数据库字符集和排序规则属性.

    ALTER DATABASE my_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci

  2. 我修改了表字符集和排序规则属性.

    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

  3. 我在可能的情况下将表的每个字段设置为Encoding:UTF-8(ut8mb4)和Collat​​ion:utf8mb4_unicode_ci

  4. 我在CodeIgniter应用程序中修改了数据库连接.

  5. 我运行了以下内容: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci

  6. 最后我也试过这个: REPAIR TABLE table_name; OPTIMIZE TABLE table_name;

一切都应该设置正确,但它不起作用.

数据库设置:

这是运行以下命令的结果:

`SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';`
Run Code Online (Sandbox Code Playgroud)

数据库设置

表设置:

表结构的screeshot:

表设置

数据库连接:

这些是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
    );
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

问题:

你知道为什么不工作吗?我错过了什么吗?

HYPHOTESIS 1:

我不确定,但问题的原因可能是这样的:

正如你在my.cnf中看到的那样character-set-server明确地设置为utf8mb4:

但是在数据库中运行查询之后:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

结果是 character-set-server = latin1

你知道为什么吗?为什么不实际更新?

HYPHOTESIS 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
Run Code Online (Sandbox Code Playgroud)

编辑2:

我运行了以下命令:

INSERT INTO app_messages (message_id, project_id, sender_id, receiver_id, message, timestamp, is_read)
VALUES ('496','322','77','188', '' ,'1473413606','x');
Run Code Online (Sandbox Code Playgroud)

与其他两个相似的和

他们被插入表中没有问题:

在此输入图像描述

但在实际的应用程序中我真正看到的是:( ?这次只有一个?而不是4个)

Fra*_*ssi 3

建议:

如果您需要使用表情符号,首先在本地主机上进行简单的测试。创建一个新的数据库并制作一个新的应用程序用于测试目的。

如果您按照我在问题中编写的步骤或者按照本教程操作:https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4,它必须有效。

在本地开发一个新的基本应用程序,您将拥有更多的控制权和更多的空间来进行您需要的所有测试。

解决方案:

就我而言,问题出在 CodeIgniter 中的数据库配置中。它没有正确设置 char_set 和排序规则,导致愚蠢的忽略:我覆盖了保存消息的函数中的数据库设置,以确保它可以与移动数据库一起使用。

前:

function message_save ( $data = FALSE )
{   
    $project_db_config                  = array();
    $project_db_config['hostname']      = 'MY_HOST';
    $project_db_config['username']      = 'MY_USERNAME';
    $project_db_config['password']      = 'MY_PASSWORD';
    $project_db_config['database']      = 'MY_DATABASE';

    $mobile_db                          = $this->load->database( $project_db_config, TRUE );

    // other code to save message       
}
Run Code Online (Sandbox Code Playgroud)

后:

function message_save ( $data = FALSE )
{
    $mobile_db_connection = $this->load->database('admin_mobile_mh', TRUE);
  
    // other code to save message
}
Run Code Online (Sandbox Code Playgroud)

结论:

应用程序必须正确设置与数据库的连接。如果您正确设置了数据库,但没有与应用程序建立正确的连接,则它将无法工作。

因此,如果您遇到类似的问题,请确保 api 正确设置char_setasutf8mb4db_collatas utf8mb4_unicode_ci