如何在MySQL数据库中存储表情符号字符

时间:2016-09-13 06:02:26

标签: mysql

我在项目中使用表情符号字符。该字符被保存(??)到mysql数据库中。我在utf8mb4_general_ci中使用了数据库默认排序规则。 它显示

  

1366字符串值不正确:'\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'列   第1行的“评论”

19 个答案:

答案 0 :(得分:174)

1)数据库:将数据库默认排序规则更改为utf8mb4

2)表:将表格整理更改为CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

查询:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3)代码:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdhhzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4)在数据库连接中设置utf8mb4

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

答案 1 :(得分:13)

步骤1,更改数据库的默认字符集:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

步骤2,在创建表时设置charset:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

或更改表格

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;

答案 2 :(得分:12)

如果您使用的是Solr + Mysql + Java,则可以使用:

可以使用:

  • case1:当你不想改变数据库时。
  • case2:当你必须将表情符号从Mysql导入Solr核心时。

在上述情况下,这是将表情符号存储在系统中的解决方案之一。

使用它的步骤:

使用的库:import java.net.URLDecoder;               import java.net.URLEncoder;

  1. 使用urlEncoder对带有表情符号的字符串进行编码。
  2. 将其存储在数据库中而不改变MysqlDB。
  3. 如果您愿意或可以存储,可以将其存储在solr核心(解码形式)中 编码形式。
  4. 从DB或Solr核心获取这些表情符号时,您现在可以对其进行解码 使用urlDecoder。
  5. 代码示例:

    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;
    }
    

答案 3 :(得分:7)

我的回答只是增加了Selvamani P的答案。

您可能还需要使用SET NAMES utf8更改任何SET NAMES utf8mb4个查询。这对我有用。

此外,this is a great article将您的网站从utf8移植到utf8mb4。特别是本文在将索引转换为utf8mb4之后对索引和修复表提出了2个好点:

<强>指标

  

从utf8转换为utf8mb4时,列的最大长度   或索引键在字节方面不变。因此,它更小   就角色而言,因为角色的最大长度是   现在是四个字节而不是三个。 [...] InnoDB存储引擎的最大索引长度为767字节,因此对于utf8或utf8mb4列,最多可以索引255或191个字符。如果您当前的索引长度超过191个字符的utf8列,则在使用utf8mb4时需要索引较少数量的字符。

修复表格

  

升级MySQL服务器并进行必要的更改后   如上所述,确保修复和优化所有数据库和   表。升级后我没有立即这样做(我没想到   因为乍一看似乎一切正常,所以是必要的,并且   碰到了一些奇怪的错误,其中UPDATE语句没有任何错误   效果,即使没有抛出任何错误。

阅读有关修复文章表格的查询的更多信息。

答案 4 :(得分:6)

我已将数据库和表从 utf8 升级到 utf8mb4 。但是对我来说没有任何用。然后,我尝试将列数据类型更新为 blob ,幸运的是它对我有用,并且数据已保存。甚至我的数据库和表都是 CHARACTER SET utf8 COLLATE utf8_unicode

答案 5 :(得分:5)

修改列的命令是:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

我们需要使用type = BLOB

要修改的示例如下:-

ALTER TABLE messages MODIFY content BLOB;

我检查了最新的mySQL和其他数据库是否不需要''才能在table_name,column_name等上的命令中使用。

获取并保存数据: 将聊天内容直接保存到列中并检索数据,然后从db列中以字节数组(byte[])的形式获取数据,然后将其转换为string,例如(Java代码)

new String((byte[]) arr) 

答案 6 :(得分:5)

上面的答案中没有提到要点,

我们需要在连接字符串中传递带有选项 "useUnicode=yes" "characterEncoding=UTF-8" 的查询字符串

类似这样的东西

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

答案 7 :(得分:4)

我有一个很好的解决方案,可以节省您的时间。我也遇到同样的问题,但是我无法通过第一个答案解决这个问题。

您的默认字符为utf-8。但是表情符号需要utf8mb4来支持它。 如果您有权修改mysql的配置文件,则可以执行此步骤。

因此,请执行以下步骤以升级您的字符集(从utf-8升级到utf8mb4)。

步骤1.打开mysql的my.cnf,将以下几行添加到my.cnf。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

步骤2。停止您的mysql服务,然后启动mysql服务

mysql.server stop
mysql.server start

完成! 然后,您可以检查您的角色是否已更改为utf8mb4。

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| 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                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

答案 8 :(得分:3)

数据库和表都应具有字符集utf8mb4和排序规则utf8mb4_unicode_ci

创建新数据库时,您应使用:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果您有一个现有数据库,并且想要添加支持:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

您还需要为表格设置正确的字符集和排序规则

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

,或者如果您拥有具有大量数据的现有表,则进行更改:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

请注意,不再推荐使用utf8_general_ci最佳实践。请参阅相关的问答:

What's the difference between utf8_general_ci and utf8_unicode_ci关于堆栈溢出。

答案 9 :(得分:2)

最适合我的解决方案是将数据存储为 json_encode

稍后在检索时,只需确保对其进行 json_decode

在这里,您不必更改数据库和表的排序规则或字符集。

答案 10 :(得分:1)

对于试图在托管MySQL实例(在我的情况下为AWS RDS)上解决此问题的任何人,最简单的方法是modify the parameter group并将server character set and collation设置为utf8mb4和{ {1}}。重新引导服务器后,快速查询将验证系统数据库和任何新创建的数据库的设置:

utf8mb4_bin

答案 11 :(得分:1)

对于Rails,不要忘记添加以下内容:

encoding: utf8mb4
collation: utf8mb4_bin

到您的数据库。yml

答案 12 :(得分:0)

有两种方式--> # 方法一 最简单的方法是按照以下步骤操作:

第 1 步:

SET NAMES utf8mb4;

第 2 步:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

第 3 步:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

第 4 步:

ALTER TABLE table_name CHANGE column column VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

仅此而已!!

#方式二(对于 Python)

这是一个黑客,它的工作就像一个魅力

第 1 步: 对您的字符串进行编码并以 ASCII 进行解码,然后将其保存到您的数据库中。

content = '?? Content to be save in ?? Database ??'
encoded_content = content.encode('unicode-escape').decode('ASCII'))

这只是将编码内容字符串存储在数据库中

第 2 步: 在获取此列数据以显示您的用户时,只需将其转换, 这里content是从数据库中获取的数据。

c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')

完成!!

答案 13 :(得分:0)

实际上我使用的是 mysql Ver 8.0.23 我已经创建了数据库和表,没有改变它们:

mysql> CREATE DATABASE tp2;

查询成功,1 行受影响(0.30 秒)

mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '? oh my god');

然后选择后,我觉得它运行良好!

我不知道是否要求将表情符号输入为十六进制或其他编码字符串,或者只是照原样复制...如果我错了,请纠正我,谢谢!

答案 14 :(得分:0)

如果您使用PHP进行插入,并且已遵循上述各种ALTER数据库和ALTER表选项,请确保您的php连接的字符集为utf8mb4。

连接字符串示例:

$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc

请注意,“字符集”是utf8mb4,而不仅仅是utf8!

答案 15 :(得分:0)

如果使用命令行界面将sql文件插入数据库。

确保您的表字符集utf8mb4和列排序规则utf8mb4_unicode_ciutf8mb4_bin

mysql -u root -p123456 my_database < profiles.sql

第1679行的错误1366(HY000):不正确的字符串值:第328行的'note'列的'\ xF0 \ x9F \ x98 \ x87 \ xF0 \ x9F ...'

我们可以用这个参数解决问题 --default-character-set=name(设置默认字符集)

mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql

答案 16 :(得分:0)

嗨,我的朋友们 这就是我解决这个问题的方式,也很高兴也教您 我在Android应用程序中 我对包含文本和emoj的字符串进行加密,然后将其发送到服务器,并将其保存在mysql表中,从服务器接收到它之后,我将其解密并在textview中显示。 在请求之前和响应之后对我的消息进行编码和解码: 我通过这种方法通过pdo将Android应用消息发送到mysql,并通过pdo接收它们。而且我没有问题。 我认为这是个好方法。请喜欢 感激

 
 public void main()
 {
    String message="hi mester ali moradi ?️?️ how are you ?";
    String encoded_message=encodeStringUrl(message);
    String decode_message=decodeStringUrl(encoded_message);
 }
 public static String encodeStringUrl(String message) {
        String encodedUrl =null;
        try {
            encodedUrl = URLEncoder.encode(message, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return encodedUrl;
        }
        return encodedUrl;
    }

    public static String decodeStringUrl(String message) {
        String decodedUrl =null;
        try {
            decodedUrl = URLDecoder.decode(message, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return decodedUrl;
        }
        return decodedUrl;
    }
消息:嗨,梅斯特·阿里·莫拉迪?️?️你好吗? 编码:ghgh%F0%9F%98%AE%F0%9F%A4%90%F0%9F%98%A5 解码:hi mester ali moradi?️?️你好吗?

答案 17 :(得分:0)

表情符号支持具有技术堆栈的应用程序-mysql,java,springboot,休眠

在下面的mysql更改中应用以支持unicode。

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

数据库连接-jdbc网址更改:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

注意-如果上述步骤不起作用,请将mysql-connector版本更新为8.0.15。 (mysql 5.7与连接器版本8.0.15一起使用,以支持unicode)

答案 18 :(得分:0)

那么,您无需更改整个数据库字符集。相反,您可以通过将列更改为 blob 类型来实现。

ALTER TABLE消息修改内容BLOB;