对 a question I asked yesterday 的回复之一建议我应该确保我的数据库可以正确处理 UTF-8 字符。我怎么能用 MySQL 做到这一点?
CHARACTER SETs
; 5.1.24 弄乱了德语 Sharp-s (ß) 的排序规则,通过在 5.1.62 中添加另一个排序规则进行了纠正(可以说让事情变得更糟); 5.5.3 用新的字符集 utf8mb4 填写 utf8。
utf8
。它只支持最多 3 个字节的字符。您应该在 MySQL 中使用的正确字符集是 utf8mb4
。
更新:
简短的回答 - 您应该几乎总是使用 utf8mb4
字符集和 utf8mb4_unicode_ci
排序规则。
要更改数据库:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
看:
Aaron 对此答案的评论如何使 MySQL 正确处理 UTF-8
utf8_general_ci 和 utf8_unicode_ci 有什么区别
转换指南:https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
原答案:
MySQL 4.1 及更高版本有一个默认的 UTF-8 字符集。您可以在您的 my.cnf
文件中验证这一点,请记住设置 both 客户端和服务器(default-character-set
和 character-set-server
)。
如果您有想要转换为 UTF-8 的现有数据,请转储您的数据库,然后将其导入为 UTF-8,确保:
在查询/插入数据库之前使用 SET NAMES utf8
创建新表时使用 DEFAULT CHARSET=utf8
此时您的 MySQL 客户端和服务器应该是 UTF-8(请参阅 my.cnf)。请记住,您使用的任何语言(例如 PHP)也必须是 UTF-8。某些版本的 PHP 将使用他们自己的 MySQL 客户端库,它可能不支持 UTF-8。
如果您确实要迁移现有数据,请记住先备份!当事情没有按计划进行时,可能会发生很多奇怪的数据截断!
一些资源:
完成 UTF-8 迁移 (cdbaby.com)
关于 php 函数的 UTF-8 准备情况的文章(请注意其中一些信息已过时)
要使其成为“永久”,请在 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。
set character_set_client=utf8;
设置新值
MySQL 4.1 及更高版本有一个默认字符集,它调用 utf8
但它实际上只是 UTF-8 的一个子集(只允许三字节或更小的字符)。
如果您想要“完整”UTF-8,请使用 utf8mb4
作为您的字符集。
utf8
不包括表情符号等字符。 utf8mb4
确实如此。检查此以获取有关如何更新的更多信息:mathiasbynens.be/notes/mysql-utf8mb4
简短的回答:在 4 个地方使用 utf8mb4
:
您客户端中的字节是 utf8,而不是 latin1/cp1251/等。
在建立客户端与 MySQL 的连接时设置名称 utf8mb4 或等效项
所有表/列上的字符集 utf8mb4 - 除了严格为 ascii/hex/country_code/zip_code/etc 的列。
如果要输出到 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。
我遵循了哈维尔的解决方案,但我在 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 有一定的重要性。
skip-character-set-client-handshake
是关键。
要将数据库本身的字符集编码更改为 UTF-8,请在 mysql> 处键入以下命令。迅速的。 USE ALTER DATABASE
.. 将 DBNAME 替换为数据库名称:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
这是这个问题的重复How to convert an entire MySQL database characterset and collation to UTF-8?
将您的 database collation
设置为 UTF-8
,然后将 table collation
应用到数据库默认值。
您的答案是您可以通过 MySql 设置进行配置。在我的回答中可能有些断章取义,但这也知道对您有帮助。
如何配置 Character Set
和 Collation
。
对于使用默认 MySQL 字符集和排序规则(latin1、latin1_swedish_ci)存储数据的应用程序,不需要特殊配置。如果应用程序需要使用不同的字符集或排序规则存储数据,您可以通过多种方式配置字符集信息:
指定每个数据库的字符设置。例如,使用一个数据库的应用程序可能需要 utf8,而使用另一个数据库的应用程序可能需要 sjis。
在服务器启动时指定字符设置。这会导致服务器将给定的设置用于不进行其他安排的所有应用程序。
如果您从源代码构建 MySQL,请在配置时指定字符设置。这会导致服务器对所有应用程序使用给定的设置,而无需在服务器启动时指定它们。
此处显示的示例为您设置 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
这对我有用:
mysqli_query($connection, "SET NAMES 'utf8'");
与 UTF-8 的数据库连接
$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());
SET NAMES UTF8
这是诀窍
SET NAMES UTF8
(或 UTF8mb4
)是正确的,但您没有解释它的作用(用于此连接的字符集)。 “这可以解决问题”听起来可以解决问题(使 MySQL 正确处理 UTF-8),但许多 MySQL 数据库默认设置为 latin1,因此不会使其成为正确的解决方案。我会将 change the default charset 和表字符集设置为 utf8mb4。真的,这个答案相当不完整,所以我投了反对票。
将数据库连接设置为 UTF8:
if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){
//set to utf8 encoding
mysql_set_charset('utf8',$handle);
}
mysql_*
接口。切换到 mysqli_*
或 PDO
。
能够找到解决方案。按照 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
不会执行最重要的 init_connect
。
不定期副业成功案例分享
utf8
仅指完整 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.htmlutf8mb4
会占用额外的存储空间。虽然char
字符串是预先分配的,但varchar
字符串不是 - 请参阅 this documentation page 的最后几行。例如,char(10)
将悲观地在 utf8mb4 下保留 40 个字节,但varchar(10)
将分配与可变长度编码保持一致的字节。varchar(n)
字段更改为大于可行字节大小(同时发出警告),当前版本的 mysql 将自动从varchar(n)
升级到text
数据类型。指数也会有一个最坏情况下的上限,这可能会带来其他问题。