ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一个使用默认排序规则 utf8mb4_general_ci 配置的 MySQL 数据库。当我尝试使用以下查询在文本中插入包含表情符号字符的行时

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');

MySQL正在引发以下错误

1366 不正确的字符串值:'\xF0\x9F\x98\x83\xF0\x9F...' 用于第 1 行的列 'comment'

您如何保存数据?你能告诉我们那个代码吗?
谢谢你的评论。我已经找到将此更改数据库默认集合的解决方案设置为 **utf8mb4 ** 并将更改表集合设置为 ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **。 ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
代码: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");
你用的是什么客户端?您也可以在连接时指定 utf8mb4

K
K-Gun

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');

是否可以不更改数据库默认集合?
这对我不起作用。我正进入(状态 ”???”而不是表情符号。只有“☺”这个笑脸安全地进入了数据库。
可能不仅需要将表更新为 utf8mb4,还需要将列本身更新,否则它们仍然可以显示为 ??而不是💙。
为我工作,但不要忘记重新启动 MySQL。
我需要运行 SET NAMES utf8mb4; 开始保存表情符号;在该命令之前,它将它们保存为 ??
t
temirbek

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

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

如果尚未创建数据库,请使用正确的编码创建它:

CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT 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;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;

我遵循了这些查询并停止并重新启动了 mysql 服务器,但是当我尝试将表情符号插入到我的表中时,我仍然得到同样的错误。除 INSERT 外,所有命令均成功通过。插入条目(日期、时间、标题)值(2018-05-20'、'12:38:00'、'带有表情符号的测试描述:😊❤️');列设置为 Collation: utf8mb4_0900_ai_ci 定义:描述文本
您的连接还需要是 utf8mb4 而不是 utf8 才能正常工作。
@ospider,在第 2 步中,您使用 utfmb4_general_ci 而不是 unicode - 为什么?
@Warren - “Unicode”和“utf8”是相关的,但“unicode”在这种情况下是不正确的。
无需修改数据库。只是改变表就足够了。那些说“它没用”的人可能是从应用程序层尝试的。在您的应用程序层中,您还必须更改数据库连接的字符集和整理。
H
Harpreet

修改列的命令是:

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) 

是的。如果您只需要在某个字段中存储像表情符号之类的 unicode,则接受的答案太麻烦了,只需将 text / varchar 字段更改为 blob 即可。疯狂地为此在整个数据库上转换字符集和排序规则:)
我尝试更改排序规则,但只有 blob 类型解决了我的问题(PHP)。
可能值得指出的是,“正确”的方法是将我们的数据库迁移到 utf8mb4。但是对于一个或两个领域的快速破解,这是最好的方法。
s
samawaat

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

What's the difference between utf8_general_ci and utf8_unicode_ci 在堆栈溢出上。


我有一个包含数据的数据库和表。在执行第二个 alter 语句时,说:错误 1833(HY000):无法更改列“id”:用于表“lizbazi.post”的外键约束“FK12njtf8e0jmyb45lqfpt6ad89”
@SeyyedMahdiyarZerehpoush – 您可以通过将更新限制在需要它的特定列来摆脱困境,如下所述:stackoverflow.com/a/15781925/1247581 例如ALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
对列使用 utf8mb4_binutf8mb4_unicode_ci 时有什么不同吗?
谢谢@SeyyedMahdiyarZerehpoush,我只是在需要表情符号时更改列表,仅此而已。无需在数据库或表级别更改排序规则和字符集
M
Miguel Almeida

如果你使用 Solr + Mysql + Java,你可以使用:

这可以使用:

case1:当您不想更改数据库时。

case2:当你必须将表情从你的 Mysql 导入到 Solr 核心时。

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

使用步骤:

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

使用 urlEncoder 对具有表情符号的字符串进行编码。将其存储在 DB 中而不更改 MysqlDB。如果需要,您可以将其存储在 solr core(解码形式)中,也可以存储编码形式。从 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;
}

感谢您提供此代码片段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的问题解决方案,正确解释would greatly improve它的长期价值,并使其对有其他类似问题的未来读者更有用。请edit您的回答以添加一些解释,包括您所做的假设。
编码/解码函数调用往往会造成麻烦。而是在各个地方修复字符集设置。
这不是解决问题,而是绕过它。而且你会遇到很多使用这种方法的问题,例如你会减慢你的应用程序,因为你必须对所有内容进行解码和编码。此外,如果您输入字符 %,您的解码将中断。
D
Deepak Arora

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


N
Nicola Pedretti

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

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

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

索引

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

修理桌子

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

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


REPAIR TABLEOPTIMIZE TABLE 应该是不必要的 - ALTER 具有执行它们的效果。
T
Tina Bri

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

您的默认字符是 utf-8。但是 emoji 需要 utf8mb4 来支持。如果你有权限修改mysql的配置文件,可以按照这个步骤进行。

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

步骤 1. 打开您的 my.cnf for mysql,将以下行添加到您的 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)

对于任何使用 MariaDB 的人来说,一个小区别 - 配置行必须是 init-connect='SET NAMES utf8mb4'(使用 - 而不是 _
u
user3855339

好吧,您不需要更改整个 DB 字符集。取而代之的是,您可以通过将列更改为 blob 类型来做到这一点。

ALTER TABLE 消息修改内容 BLOB;


R
Rishabh Jhalani

有两种方法--> # 方法一 最简单的方法如下:

步骤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 步:在获取此列数据以显示您的用户时,只需对其进行转换,这里的内容是从数据库中获取的数据。

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

完毕!!


或在 Ruby 中... "\xF0\x9F\x91\x8F".dump.undump 其中 dump 转义 unicode 并 undump 恢复它
D
Delphi Coder

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

在 mysql 中应用以下更改以获得 unicode 支持。

ALTER DATABASE <数据库名称> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

数据库连接 - jdbc url 更改:

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

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


A
Ashh

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

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

像这样的东西

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

S
Siddhant

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

稍后当您检索时,请确保您 json_decode 它。

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


M
Myles Baker

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

SELECT * FROM information_schema.SCHEMATA S;

l
lafeber

对于 Rails,在接受的答案旁边,不要忘记添加:

encoding: utf8mb4
collation: utf8mb4_bin

到你的 database.yml


R
Richard

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

连接字符串示例:

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

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


Z
ZygD

今天我面临同样的问题,但其他答案中的解决方案对我不起作用。这是我的解决方案。

首先,更改 mysql/my.ini、数据库和表中的字符集是必要的,如其他答案中所述。

其次,如果您在保存表情符号之前已经创建了表格,您可以使用

SHOW FULL COLUMNS FROM `yourcolumn`;

检查要保存表情符号的列是否设置为utf8mb4。您会发现您的大部分列仍然是 utf8 字符集。

利用

ALTER TABLE `yourtable` CHANGE `yourcolumn` `yourcolumn` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

A
André Walker

我在将 MySQL 5.0 升级到 MySQL 8.0 AWS RDS 时遇到了这个问题,最终尝试了很多对我有用的东西与大家分享。

错误:

警告:PDOStatement::execute(): SQLSTATE[HY000]:一般错误:3988 从排序规则 utf8_unicode_ci 转换为 utf8mb4_general_ci 不可能用于第 87 行数组 ([0] => HY000 [ 1] => 3988 [2] => 从排序规则 utf8_unicode_ci 转换为 utf8mb4_general_ci 参数不可能)

后端:PHP5/php7 + PDO 很麻烦。

解决方案:只需要做两件事

在你的 pdo 连接后添加一行代码 $conn->exec("set names utf8mb4");其中 $conn 是 PDO 中的连接处理程序更改表并设置字符集 utf8mb4 并整理 utf8mb4_unicode_ci。 ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;此命令会将您的每一列字符集更改为 utf8mb4 和排序规则。


C
Chad Elkins

把它放在你的数据库调用之前:

    mysqli_set_charset($db, "utf8mb4");

这将允许您将表情符号直接输入到已设置为排序规则的数据库表中:utfmb4_bin。确保也将您的列设置为 utfmb4。


a
ali moradi

嗨,我的朋友们,这就是我解决这个问题的方法,我也很乐意教给你我在 Android 应用程序中我加密了一个包含文本和表情符号的字符串并将其发送到服务器并将其保存在 mysql 表中,然后从服务器接收它我解密它并在文本视图中显示它。在请求之前和响应之后对我的消息进行编码和解码:我通过此方法通过 pdo 将 Android 应用程序消息发送到 mysql 并使用 pdo 接收它们。我没有问题。我认为这是一个好方法。请喜欢谢谢

public void main() { String message="hi mester ali moradi 🌦️🌦️ 你好吗?";字符串编码消息=encodeStringUrl(消息);字符串 decode_message=decodeStringUrl(encoded_message); } public static String encodeStringUrl(String message) { String encodedUrl =null;尝试 { encodedUrl = URLEncoder.encode(message, "UTF-8"); } catch (UnsupportedEncodingException e) { return encodedUrl; } 返回编码的Url; } public static String decodeStringUrl(String message) { String decodedUrl =null;尝试 { decodedUrl = URLDecoder.decode(message, "UTF-8"); } catch (UnsupportedEncodingException e) { return decodedUrl; } 返回解码的Url; }


M
Mehmet Hanoğlu

如果您使用命令行界面将 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

y
younessov

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

mysql> CREATE DATABASE tp2;

查询正常,1 行受影响(0.30 秒)

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

然后在选择之后,我觉得它工作得很好!

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


I
Iwan Ross

我尝试了不同的方法和方法,并找到了适合我的方法。

更新查询的 SQL:

ALTER DATABASE YOUR_DB_NAME_HERE CHARACTER SET = utf8mb4 COLLATE = 
utf8mb4_unicode_ci;

你可以在表格中看到,表情符号的存在

https://i.stack.imgur.com/e5dnJ.png

如果您访问此页面:https://www.thecookingcat.com/recipes/thai-green-curry.php#comments

您可以在评论中看到表情符号。

我在网站上也有一个 RSS 提要,并且表情符号包含在 RSS 提要 XML 代码中。