我有一个使用默认排序规则 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'
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
。
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');
第 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;
修改列的命令是:
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)
text
/ varchar
字段更改为 blob
即可。疯狂地为此在整个数据库上转换字符集和排序规则:)
utf8mb4
。但是对于一个或两个领域的快速破解,这是最好的方法。
数据库和表都应该有字符集 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 TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
utf8mb4_bin
与 utf8mb4_unicode_ci
时有什么不同吗?
如果你使用 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;
}
%
,您的解码将中断。
我已更新我的数据库和表以从 utf8 升级到 utf8mb4。但没有什么对我有用。然后我尝试将列数据类型更新为 blob,幸运的是它对我有用并且数据已保存。甚至我的数据库和表都是 CHARACTER SET utf8 COLLATE utf8_unicode
我的回答只增加了 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 TABLE
和 OPTIMIZE TABLE
应该是不必要的 - ALTER
具有执行它们的效果。
我有一个很好的解决方案来节省您的时间。我也遇到了同样的问题,但我无法通过第一个答案解决这个问题。
您的默认字符是 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)
init-connect='SET NAMES utf8mb4'
(使用 -
而不是 _
)
好吧,您不需要更改整个 DB 字符集。取而代之的是,您可以通过将列更改为 blob 类型来做到这一点。
ALTER TABLE 消息修改内容 BLOB;
有两种方法--> # 方法一 最简单的方法如下:
步骤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')
完毕!!
"\xF0\x9F\x91\x8F".dump.undump
其中 dump
转义 unicode 并 undump
恢复它
表情符号支持具有技术堆栈的应用程序 - mysql、java、springboot、hibernate
在 mysql 中应用以下更改以获得 unicode 支持。
ALTER DATABASE <数据库名称> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE
数据库连接 - 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 支持)
上面的答案中没有提到要点,
我们需要在连接字符串中传递带有选项 "useUnicode=yes"
和 "characterEncoding=UTF-8"
的查询字符串
像这样的东西
mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
对我有用的最简单的解决方案是将数据存储为 json_encode。
稍后当您检索时,请确保您 json_decode 它。
在这里,您不必更改数据库和表的排序规则或字符集。
对于任何试图在托管 MySQL 实例上解决此问题的人(在我的情况下是在 AWS RDS 上),最简单的方法是 modify the parameter group 并将 server character set and collation 分别设置为 utf8mb4
和 utf8mb4_bin
。重新启动服务器后,快速查询会验证系统数据库和任何新创建的设置:
SELECT * FROM information_schema.SCHEMATA S;
对于 Rails,在接受的答案旁边,不要忘记添加:
encoding: utf8mb4
collation: utf8mb4_bin
到你的 database.yml
如果您使用 PHP 进行插入,并且您已遵循上述各种 ALTER 数据库和 ALTER 表选项,请确保您的 php 连接的字符集是 utf8mb4。
连接字符串示例:
$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc
请注意,“字符集”是 utf8mb4,而不仅仅是 utf8!
今天我面临同样的问题,但其他答案中的解决方案对我不起作用。这是我的解决方案。
首先,更改 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;
我在将 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 和排序规则。
把它放在你的数据库调用之前:
mysqli_set_charset($db, "utf8mb4");
这将允许您将表情符号直接输入到已设置为排序规则的数据库表中:utfmb4_bin。确保也将您的列设置为 utfmb4。
嗨,我的朋友们,这就是我解决这个问题的方法,我也很乐意教给你我在 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; }
如果您使用命令行界面将 sql 文件插入数据库。
确保您的表格字符集 utf8mb4
和列排序规则 utf8mb4_unicode_ci
或 utf8mb4_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
实际上我使用的是 mysql Ver 8.0.23 我已经创建了数据库和表,没有改变它们:
mysql> CREATE DATABASE tp2;
查询正常,1 行受影响(0.30 秒)
mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '🤣 oh my god');
然后在选择之后,我觉得它工作得很好!
我不知道是否要求将表情符号输入为十六进制或其他编码字符串,或者直接复制它......如果我错了,请纠正我,谢谢!
我尝试了不同的方法和方法,并找到了适合我的方法。
更新查询的 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 代码中。
不定期副业成功案例分享
SET NAMES utf8mb4;
开始保存表情符号;在该命令之前,它将它们保存为??