如何让 MySQL 正确处理 UTF-8

其中一个对 我昨天问的一个问题的回应建议我应该确保我的数据库能够正确地处理 UTF-8字符。我如何使用 MySQL 做到这一点?

278427 次浏览

更新:

简短的回答-您应该几乎总是使用 utf8mb4字符集和 utf8mb4_unicode_ci排序。

更改数据库:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

参见:

原答案:

MySQL 4.1 and above has a default character set of UTF-8. You can verify this in your my.cnf file, remember to set 都有 client and server (default-character-set and 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。

如果你想迁移现有的数据,记得先备份!当事情不按计划进行时,会发生许多奇怪的数据切割!

一些资源:

SET NAMES UTF8

这个有用

为了使这种情况“永久化”,在 my.cnf中:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

要进行检查,请转到客户端并显示一些变量:

SHOW VARIABLES LIKE 'character_set%';

验证它们都是 utf8,除了 ..._filesystem,它应该是 binary..._dir,它指向 MySQL 安装中的某个位置。

字符集是数据库(默认)和表的属性。 You can have a look (MySQL commands):

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;

我遵循了 Javier 的解决方案,但是我在 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有一些重要性。

将数据库连接设置为 UTF8:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){
//set to utf8 encoding
mysql_set_charset('utf8',$handle);
}

MySQL 4.1及以上版本有一个默认字符集,它调用 utf8,但实际上它只是 UTF-8的一个子集(只允许3字节字符和更小的字符)。

使用 utf8mb4作为您的字符集,如果你想“完整”UTF-8。

能够找到一个解决方案。按照指定的 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;

The short answer: Use utf8mb4 in 4 places:

  • 客户机中的字节是 utf8,而不是 latin1/cp1251/etc。
  • 在建立客户端到 MySQL 的连接时,使用 SET NAMES utf8mb4或类似的代码
  • 所有表/列上的 CHARACTER SET utf8mb4-除了严格为 ascii/十六进制/country _ code/zip _ code/等的列之外。
  • 如果输出为 HTML,则为 <meta charset charset=UTF-8>。(是的,这里的拼写不同。)

更多信息
全程 UTF8

上面的链接提供了“解决所有问题所需的详细规范答案”。——这个论坛有空间限制。

剪辑

除了包含“所有”字符的 CHARACTER SET utf8mb4之外,COLLATION utf8mb4_unicode_520_ci可以说是使用的“最佳全面”排序规则。(还有土耳其语、西班牙语等语种的校对,供那些希望在这些语言中找到细微差别的人使用。)

您的答案是可以通过 MySql 设置进行配置。在我的回答可能是一些脱离上下文,但这也是知道是对你的帮助。
如何配置 Character SetCollation

用于使用默认 MySQL 字符集存储数据的应用程序 和排序规则(latin1, latin1_swedish_ci) ,没有特殊的配置 如果应用程序需要使用 不同的字符集或排序规则,可以配置字符集 资讯多种途径:

  • 指定每个数据库的字符设置 使用一个数据库的应用程序可能需要 utf8,而使用 使用另一个数据库可能需要 sjis。
  • Specify character settings at server startup. This causes the server 使用给定设置的所有应用程序 arrangements.
  • 如果构建 MySQL,请在配置时 指定字符设置 这会导致服务器对所有 应用程序,而不必在服务器启动时指定它们。

这里显示的例子是为您的问题设置 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

在 MySQL 配置时指定字符设置

shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

若要查看应用于连接的字符集和排序规则系统变量的值,请使用以下语句:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

这可能是冗长的答案,但有所有的方式,你可以使用。希望我的回答对你有帮助。了解更多信息

要将数据库本身的字符集编码更改为 UTF-8,请在 mysql > 提示符下键入以下命令。使用 ALTER DATABASE。.将 DBNAME 替换为数据库名称:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

这是这个问题 如何将整个 MySQL 数据库字符集和排序规则转换为 UTF-8?的副本

database collation设置为 UTF-8 然后将 table collation应用于数据库默认值。

数据库连接到 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());

这对我很有效:

Mysqli _ query ($connect,“ SET NAMES‘ utf8’”) ;