在我昨天提出的一个问题的回答之一建议我应该确保我的数据库能够正确处理UTF-8字符。我如何在MySQL中做到这点?
更新:
简短回答 - 几乎总是应该使用 utf8mb4
字符集和 utf8mb4_unicode_ci
排序规则。
修改数据库:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
参见:
Aaron在这个回答中的评论:如何使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
仅涵盖Unicode的一个小子集。你应该使用utf8mb4
来确保完全支持Unicode。请参考http://mathiasbynens.be/notes/mysql-utf8mb4。长时间以来,我一直在使用MySQL的`utf8`字符集来创建数据库、表和列,并*假设*它映射到上述UTF-8编码。 - Aaron McDaidlatin1
和latin1_swedish_ci
作为默认字符集和排序规则。请参考MySQL手册中的“服务器字符集和排序规则”页面进行确认:https://dev.mysql.com/doc/refman/5.1/en/charset-server.html。 - Animismutf8mb4
在大多数文本为 ASCII 时会占用额外的存储空间。虽然 char
字符串是预分配的,但 varchar
字符串不是--请参见此文档页面上的最后几行。例如,char(10)
在 utf8mb4 下会悲观地保留 40 个字节,但 varchar(10)
将根据可变长度编码分配字节。 - Kevin A. Naudé要使此更改“永久生效”,请在 my.cnf
中进行以下修改:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
要检查,请转到客户端并显示一些变量:
SHOW VARIABLES LIKE 'character_set%';
验证它们全部都是utf8
编码,除了..._filesystem
应该是binary
编码和指向MySQL安装位置的..._dir
。
create table my_name(field_name varchar(25) character set utf8);
。 - Marek BarMySQL 4.1及以上版本默认采用称为utf8
的字符集,但实际上它只是UTF-8的子集(仅支持三个字节或更小的字符)。
如果需要"完整"的UTF-8,请使用utf8mb4
字符集。
utf8
不包括表情符等字符,而 utf8mb4
则包括。查看此链接以获取有关如何更新的更多信息:https://mathiasbynens.be/notes/mysql-utf8mb4 - jibai31utf8mb4
:
SET NAMES utf8mb4
或类似方法。CHARACTER SET utf8mb4
,但排除仅限于ascii/hex/country_code/zip_code等的列。<meta charset charset=UTF-8>
。(是的,这里的拼写不同)上述链接提供了“需要处理所有问题的详细规范答案”。-- 本论坛有空间限制。
编辑
除了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 utf8mb4; /* was: utf8 */
要将数据库本身的字符集编码更改为UTF-8,请在mysql>提示符下输入以下命令。使用 ALTER DATABASE
.. 替换DBNAME为数据库名称:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
这是一个与此问题重复的问题如何将整个MySQL数据库字符集和排序规则转换为UTF-8?
我按照Javier的解决方案进行了操作,但在my.cnf文件中添加了一些不同的行:
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
是关键。 - Marcus使用在mysql上排序utf8mb4,在DBI连接中添加属性mysql_enable_utf8mb4并在连接到mysql后执行sql命令"SET NAMES utf8mb4"将使perl正确处理UTF-8。
#!/usr/bin/perl
print "Content-type: text/html; charset=UTF-8\n\n";
#use utf8;
#use open ':utf8';
#binmode STDOUT, ":utf8";
#binmode STDIN , ":utf8";
#use encoding 'utf8';
our $dbh = DBI->connect("DBI:mysql:database=$database;host=$servername;port=$port",$username,$password, {PrintWarn => 0, PrintError => 0, mysql_enable_utf8mb4 => 1}) || die;
$dbh->do("SET NAMES utf8mb4");
将您的数据库排序规则
设置为UTF-8
,然后将表排序规则
应用于数据库默认值。
你的答案是可以通过 MySql 设置进行配置。我的回答可能有些脱离上下文,但这也是对你有帮助的。
如何配置 字符集
和 校对规则
。
对于使用默认 MySQL 字符集和校对规则 (
latin1, latin1_swedish_ci
) 存储数据的应用程序,不需要特殊配置。如果应用程序需要使用不同的字符集或校对规则存储数据,则可以通过以下几种方式配置字符集信息:
utf8
,而使用另一个数据库的应用程序可能需要 sjis。这里展示了有关设置utf8字符集的问题的示例,同时还设置了更有帮助的排序规则(utf8_general_ci
排序规则)。
为每个数据库指定字符设置
CREATE DATABASE new_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
在服务器启动时指定字符设置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
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。
utf8
。它只支持最多3字节的字符。在MySQL中应该使用的正确字符集是utf8mb4
。 - SineSwiper