MySQL中utf8mb4
和utf8
charsets有什么区别?
我已经知道ASCII,UTF-8,UTF-16和UTF-32编码; 但我很想知道utf8mb4
编码组与MySQL服务器中定义的其他编码类型的区别.
是否有任何特殊利益/建议使用utf8mb4
而不是utf8
?
这是我的连接设置方式:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
当tyring为表添加一行时,我收到以下错误:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
我正在插入数千条记录,当文本包含\ xF0时,我总是会收到此错误(即错误的字符串值始终以\ xF0开头).
该列的排序规则为utf8_general_ci.
可能是什么问题呢?
我尝试从MySQL数据库中的服务中保存用户的名称.这些名字可以包含表情符号(仅举例)
搜索了一下后,我发现这个stackoverflow链接到本教程.我按照步骤操作,看起来一切都配置正确.
我有一个数据库(charset和collation设置为utf8mb4(_unicode_ci)),一个名为TestTable的表,也是这样配置的,以及一个"Text"列,以这种方式配置(VARCHAR(191)utf8mb4_unicode_ci).
当我尝试保存表情符号时,我收到一个错误:
Example of error for shortcake ():
Warning: #1300 Invalid utf8 character string: 'F09F8D'
Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1
Run Code Online (Sandbox Code Playgroud)
我能够正确保存的唯一表情符号是太阳☀️
虽然我没有尝试所有这些都是诚实的.
我在配置中缺少什么?
请注意:所有保存测试都不涉及客户端.我使用phpmyadmin手动更改值并保存数据.因此,在服务器正确保存emojis 之后,我将负责正确配置客户端.
另一个旁注:目前,在保存表情符号时,我或者得到上面的错误,或者没有错误,数据Username
将被存储为Username ????
.错误或无错误取决于我保存的方式.当通过SQL语句创建/保存时我用问号保存,当编辑内联时我用问号保存,当使用编辑按钮进行编辑时,我得到错误.
谢谢
编辑1: 好吧所以我认为我发现了问题,但不是解决方案.看起来数据库特定变量没有正确更改.
当我在我的服务器上以root用户身份登录并读出变量(全局)时:
使用的查询:SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 …
Run Code Online (Sandbox Code Playgroud) 我使用的是mysql 5.5.10,它的character_sets是
| 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/share/mysql/charsets/ |
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
Run Code Online (Sandbox Code Playgroud)
我从utf8为iOS5的表情符号改变了utf8mb4.它们由4byte代码表示.
但当我插入3个笑脸表情符号时,'???' 在mysql中.
它们是3F 3F 3F(Hex).
我可以很好地存储iOS4的表情符号,但不能存储iOS5的表情符号.
我怎么能存储iOS5的表情符号?
请帮我.
我有一个MySQL转储,我试图恢复:
mysql -u"username" -p"password" --host="127.0.0.1" mysql_db < mysql_db
Run Code Online (Sandbox Code Playgroud)
但是,这引发了一个错误:
ERROR 1115 (42000) at line 3231: Unknown character set: 'utf8mb4'
Run Code Online (Sandbox Code Playgroud)
这是第3231-3233行:
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_general_ci */ ;
Run Code Online (Sandbox Code Playgroud)
我正在使用MySQL 5.1.69.我该如何解决这个错误?
我知道有很多关于此的问题,但我认为我的数学是正确的.
255 * 3 = 765
字节除非UNQUE每个条目需要额外的200多个字节,为什么这不起作用?
mysql> ALTER TABLE entry ADD UNIQUE INDEX (name(255));
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
Run Code Online (Sandbox Code Playgroud)
我能做些什么吗?
编辑:
事实证明,限制是250.对于唯一索引,字符似乎计为4个字节,但我不知道为什么.
编辑2:
感谢Vladislav Vaintroub,charset确实是utf8mb4.这解决了这个谜.我没有看到有关此更改的任何文档.
我猜它通过隐式截断字段来构建非唯一索引,这对于唯一索引是不可接受的,所以它拒绝.
如果您重新输入您的评论作为答案,我很乐意接受.
解决方案:指定utf8,而不是utf8mb4(MySQL Admin不允许这样做,因此请手动创建表)
我正在尝试将以下推文存储到longtext列/ utf8 charset/MySQL 5.5中.带有MyISAM存储的数据库.
我们也尝试过utf8mb4,utf16,utf32字符集,但无法解决这个问题.
tweet="@Dorable_Dimples: Okay enough of those #IfYouWereMines I'm getting dep
ressed. #foreveralone ?" lol yes
mysql> ALTER DATABASE foo CHARACTER SET utf8 COLLATE utf8_bin;
mysql> show variables like 'char%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.5.12.R1/share/charsets/ | …
Run Code Online (Sandbox Code Playgroud) utf16或utf32?我正在尝试以多种语言存储内容.某些语言使用双宽字体(例如,日语字体通常是英文字体的两倍).我不确定我应该使用哪种数据库.有关这四个字符集之间差异的任何信息......
我在mysql 5.1服务器中使用utf8 charset mysql表,它不支持表中的utf8mb4编码.插入4字节编码的utf8字符时"","","","","","?",""
.该表将弹出错误或跳过以下文本.
如何以编程方式检测PHP中的4字节编码的utf8字符并替换它们?
请帮助我理解在MySQL utf8mb4字段中如何处理像emoji这样的多字节字符.
请参阅下面的简单测试SQL来说明挑战.
/* Clear Previous Test */
DROP TABLE IF EXISTS `emoji_test`;
DROP TABLE IF EXISTS `emoji_test_with_unique_key`;
/* Build Schema */
CREATE TABLE `emoji_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`string` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `emoji_test_with_unique_key` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`string` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT …
Run Code Online (Sandbox Code Playgroud)