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


172

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

1366错误的字符串值:第1行的'comment'列的'\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'


1
您如何保存数据?您能告诉我们该代码吗?
Tomas Buteler

1
谢谢你的评论。我已找到此更改数据库默认集合为utf8mb4 **的解决方案,并且更改表集合为CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **的解决方案。 ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Selvamani P

1
代码:insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'在数据库连接中设置utf8mb4: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

Answers:


29

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

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

步骤2,在创建表时设置字符集:

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;

我遵循这些查询并停止并重新启动mysql服务器,但是当我尝试将emoji表情插入到我的表中时,我仍然遇到相同的错误。除INSERT外,所有命令均成功传递。INSERT INTO条目(日期,时间,标题)值(2018-05-20','12:38:00','使用表情符号测试描述:😊❤️'); 列设置为归类:utf8mb4_0900_ai_ci定义:描述文本

1
您的连接也需要是utf8mb4而不是utf8才能正常工作。
Henrik Hansen

3
@ospider,在第2步中,您使用utfmb4_general_ci而不是unicode-任何原因?
沃伦

263

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', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 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');

4
是否可以不更改数据库默认集合?
AliN11 '10 -10-10

23
这对我不起作用。我正进入(状态 ”???” 而不是表情符号。只有“☺”这才使它安全地存储到数据库中。
Curious Developer

10
可能不仅需要将表更新为utf8mb4,还需要将列本身更新,否则它们仍可能显示为??。代替💙。
艾尔2015年

2
为我工作,但不要忘记重启MySQL。
拉维·米斯拉

8
我需要运行SET NAMES utf8mb4;以开始保存表情符号;在执行该命令之前,将其另存为??
cubbuk '18

18

数据库和表都应具有字符集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不再推荐最佳做法。请参阅相关的问答:

堆栈溢出时utf8_general_ci和utf8_unicode_ci有什么区别


执行第二ALTER语句时,我有一个数据库,包含data.and表,说:ERROR 1833(HY000):无法更改列“ID”:在一个外键约束表的“FK12njtf8e0jmyb45lqfpt6ad89“lizbazi.post”使用
赛义德Mahdiyar Zerehpoush

@SeyyedMahdiyarZerehpoush –您可能可以将更新限制为需要更新的特定列,如此处所述: stackoverflow.com/a/15781925/1247581例如ALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

对列使用utf8mb4_binvs 时有什么区别utf8mb4_unicode_ci
穆罕默德·奥默·阿斯兰

14

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

可以使用:

  • 情况1:当您不想更改数据库时。
  • 案例2:当您必须将表情符号从Mysql导入Solr核心时。

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

使用步骤:

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

  1. 使用urlEncoder对具有表情符号的String进行编码。
  2. 将其存储在数据库中,而无需更改MysqlDB。
  3. 您可以根据需要将其存储在solr core(已解码形式)中,也可以存储已编码形式。
  4. 现在,从DB或Solr核心获取这些表情时,您可以使用urlDecoder对其进行解码。

代码示例:

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

感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是解决问题的好方法,适当的解释将大大提高其长期价值,对于其他存在类似问题的读者来说,这样做将更为有用。请编辑您的答案以添加一些解释,包括您所做的假设。
Toby Speight

1
就像魅力一样工作,我在模型中使用了它,因此我真的不需要更改任何代码和数据库,只需更改内容的设置者和获取者上的数据模型
bowpunya

1
编码/解码功能调用会引起麻烦。而是在各个位置修复字符集设置。
里克·詹姆斯

1
这不是解决问题,而是绕过它。这种方法会遇到很多问题,例如,由于必须对所有内容进行解码和编码,因此会降低应用程序的速度。同样,如果输入字符%,解码也会中断。
乔纳森·拉利伯特

14

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


13

修改列的命令是:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

我们需要使用type = BLOB

修改示例如下:

ALTER TABLE messages MODIFY content BLOB;

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

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

new String((byte[]) arr) 

2
是。如果您只需要在某个字段中存储像emojis这样的unicode,那么可接受的答案就太过分了,只需将text/ varchar字段更改为a就blob可以了。为此,疯狂地在整个数据库上转换字符集和排序规则是:)
davidkonrad 19/12/30

9

我的答案仅添加到Selvamani P答案中。

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

另外,这是一篇很棒的文章,可以将您的网站从utf8移植到utf8mb4。特别是,在将索引转换为utf8mb4之后,本文对索引和修复表提出了2点好处:

索引

从utf8转换为utf8mb4时,列或索引键的最大长度以字节为单位不变。因此,它在字符方面较小,因为一个字符的最大长度现在是四个字节,而不是三个字节。[...] InnoDB存储引擎的最大索引长度为767个字节,因此对于utf8或utf8mb4列,您最多可以分别索引255个或191个字符。如果当前具有索引长度大于191个字符的utf8列,则在使用utf8mb4时将需要索引较少的字符。

维修台

升级MySQL服务器并进行上述必要的更改后,请确保修复和优化所有数据库和表。升级后,我并没有立即执行此操作(我认为这没有必要,因为乍看起来一切都很好),并且遇到了一些奇怪的错误,即使没有更新,UPDATE语句也没有任何作用错误被抛出。

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


REPAIR TABLE并且OPTIMIZE TABLE应该是不必要的- ALTER这样做有效果。
瑞克·詹姆斯

5

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

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

像这样

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

5

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

ALTER TABLE消息修改内容BLOB;


3

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

您的默认字符是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)

2

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

在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)


1

对我有用的最简单的解决方案是将数据存储为json_encode

稍后在检索时,只需确保将其json_decode即可

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.