CHARACTER SETs
; 5.1.24弄乱了德国Sharp-s(ß)的排序规则,该规则已在5.1.62中添加另一个排序规则进行了纠正(可以说使情况更糟);5.5.3用新的字符集utf8mb4填充utf8。
utf8
。它仅支持3个字节的字符。您应该在MySQL中使用的正确字符集是utf8mb4
。
CHARACTER SETs
; 5.1.24弄乱了德国Sharp-s(ß)的排序规则,该规则已在5.1.62中添加另一个排序规则进行了纠正(可以说使情况更糟);5.5.3用新的字符集utf8mb4填充utf8。
utf8
。它仅支持3个字节的字符。您应该在MySQL中使用的正确字符集是utf8mb4
。
Answers:
更新:
简短答案-您几乎应该始终使用utf8mb4
字符集和utf8mb4_unicode_ci
排序规则。
更改数据库:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
看到:
亚伦对此答案的评论如何使MySQL正确处理UTF-8
转换指南:https : //dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
原始答案:
MySQL 4.1及更高版本具有默认字符集UTF-8。您可以在验证这个my.cnf
文件,记得设置两个客户端和服务器(default-character-set
和character-set-server
)。
如果您希望将现有数据转换为UTF-8,请转储数据库,然后将其作为UTF-8导入,确保:
SET NAMES utf8
在查询/插入数据库之前使用DEFAULT CHARSET=utf8
在创建新表时使用my.cnf
)。请记住,您使用的任何语言(例如PHP)也必须是UTF-8。某些版本的PHP将使用他们自己的MySQL客户端库,该客户端库可能不支持UTF-8。如果要迁移现有数据,请记住先备份!当事情没有按计划进行时,可能会发生很多奇怪的数据砍伐事件!
一些资源:
utf8
MySQL内仅指完整Unicode的一小部分。您应该改用utf8mb4
强制全面支持。参见mathiasbynens.be/notes/mysql-utf8mb4 “很长一段时间以来,我一直在将MySQL的utf8字符集用于数据库,表和列,并假定它映射到上述的UTF-8编码。”
latin1
并且latin1_swedish_ci
用于默认字符集和排序规则。请参见MySQL手册中的“服务器字符集和排序规则”页面以进行确认:dev.mysql.com/doc/refman/5.1/en/charset-server.html
utf8mb4
当大多数文本为ASCII时,您不必担心会占用额外的存储空间。尽管char
字符串是预先分配的,但varchar
字符串不是-请参阅本文档页面的最后几行。例如,char(10)
将在utf8mb4下悲观地保留40个字节,但varchar(10)
将分配与可变长度编码保持一致的字节。
varchar(n)
到text
数据类型,如果你试图改变varchar(n)
字段设置为大于可行的字节大小(同时发出警告)。索引还将具有最坏情况下限的下限,并且可能会带来其他问题。
为了使这个“永久”,在my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
要进行检查,请转到客户端并显示一些变量:
SHOW VARIABLES LIKE 'character_set%';
验证它们全部为utf8
,除了..._filesystem
,应该为binary
和..._dir
,它们指向MySQL安装中的某个位置。
create table my_name(field_name varchar(25) character set utf8);
utf8
的不是“完整的” UTF-8。
MySQL 4.1及更高版本具有调用的默认字符集,utf8
但实际上仅是UTF-8的子集(仅允许使用三字节字符或更小字符)。
utf8mb4
如果要“完整” UTF-8,请用作字符集。
简短的答案:utf8mb4
在4个地方使用:
SET NAMES utf8mb4
建立客户端与MySQL的连接时的等效命令CHARACTER SET utf8mb4
在所有表/列上-严格按ascii / hex / country_code / zip_code / etc的列除外。<meta charset charset=UTF-8>
如果要输出为HTML。(是的,这里的拼写不同。)上面的链接提供了“解决所有问题都需要详细的规范答案”。-此论坛有空间限制。
编辑
除了CHARACTER SET utf8mb4
包含“所有”世界字符之外,COLLATION utf8mb4_unicode_520_ci
可以说是使用的“最佳全方位”排序规则。(也有土耳其语,西班牙语等排序规则,供那些希望使用这些语言的细微差别的人使用。)
字符集是数据库(默认)和表的属性。您可以看一下(MySQL命令):
show create database foo;
> CREATE DATABASE `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */
show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1
换一种说法; 检查或更改数据库字符集非常容易:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
utf8
的不是“完整的” UTF-8。
要将数据库本身的字符集编码更改为UTF-8,请在mysql>提示符下键入以下命令。USE ALTER DATABASE
..用数据库名称替换DBNAME:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
这是该问题的重复部分。如何将整个MySQL数据库字符集和排序规则转换为UTF-8?
我遵循了哈维尔的解决方案,但在my.cnf中添加了一些不同的行:
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
我在这里找到了这个想法:http : //dev.mysql.com/doc/refman/5.0/en/charset-server.html在页面底部的第一个/唯一用户注释中。他提到跳过字符集客户端握手非常重要。
skip-character-set-client-handshake
是关键。
这些有关MySQL和UTF-8的技巧可能会有所帮助。不幸的是,它们并不能构成完整的解决方案,只是常见的陷阱。
您的答案是可以通过MySql设置进行配置。在“我的答案”中可能是脱离上下文的,但这也知道对您有帮助。
如何配置Character Set
和Collation
。
对于使用默认MySQL字符集和排序规则(
latin1, latin1_swedish_ci
)存储数据的应用程序,不需要特殊配置。如果应用程序要求使用其他字符集或排序规则存储数据,则可以通过以下几种方式配置字符集信息:
utf8
,而使用另一个数据库的应用程序可能需要sji。此处显示的示例用于您设置utf8字符集的问题,此处还设置了归类以提供更多帮助(utf8_general_ci
collation`)。
指定每个数据库的字符设置
CREATE DATABASE new_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
在服务器启动时指定字符设置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
在MySQL配置时指定字符设置
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
要查看适用于您的连接的字符集和排序规则系统变量的值,请使用以下语句:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
这可能是一个冗长的答案,但是可以使用所有方法。希望我的回答对您有所帮助。有关更多信息,请访问http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
SET NAMES UTF8
这就是窍门
SET NAMES UTF8
(或UTF8mb4
)是正确的,但您无需解释它的作用(用于此连接的字符集)。听起来“解决了这个问题”似乎可以解决问题(使MySQL正确处理UTF-8),但是默认情况下,许多MySQL数据库默认设置为latin1,因此这并不是一个合适的解决方案。我将默认字符集和表字符集更改为utf8mb4。确实,这个答案还算不完整,因此我拒绝了。
能够找到解决方案。按照http://technoguider.com/2015/05/utf8-set-up-in-mysql/中指定的顺序运行以下命令
SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;
CHARACTER SET utf8
。 root
不会执行all-important init_connect
。