如何让MySQL正确处理UTF-8

如何让MySQL正确处理UTF-8,mysql,utf-8,Mysql,Utf 8,其中一个回复建议我应该确保我的数据库能够正确处理UTF-8字符。如何使用MySQL实现这一点?更新: CREATE DATABASE new_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 简短回答-您几乎应该始终使用utf8mb4字符集和utf8mb4\u unicode\u ci排序规则 要更改数据库,请执行以下操作: ALTER DATABASE dbname CHARACTER SET utf8m

其中一个回复建议我应该确保我的数据库能够正确处理UTF-8字符。如何使用MySQL实现这一点?

更新:

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;
简短回答-您几乎应该始终使用
utf8mb4
字符集和
utf8mb4\u unicode\u ci
排序规则

要更改数据库,请执行以下操作:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
见:

  • 亚伦对这个答案的评论

  • 转换指南:

原始答案:


MySQL 4.1及以上版本的默认字符集为UTF-8。您可以在
my.cnf
文件中验证这一点,记住同时设置客户端和服务器(
默认字符集
字符集服务器

如果您有要转换为UTF-8的现有数据,请转储数据库,并将其作为UTF-8导入,确保:

  • 在查询/插入数据库之前,请使用
    设置名称utf8
  • 创建新表时使用
    DEFAULT CHARSET=utf8
  • 此时,您的MySQL客户端和服务器应该是UTF-8(请参见
    my.cnf
    )。请记住,您使用的任何语言(如PHP)也必须是UTF-8。某些版本的PHP将使用自己的MySQL客户端库,这可能不支持UTF-8
如果确实要迁移现有数据,请记住先备份!当事情没有按计划进行时,会发生很多奇怪的数据切割

一些资源:

  • (cdbaby.com)
  • 关于的文章(注:部分信息已过时)

设置名称UTF8


这就是在my.cnf中使此“永久性”的诀窍:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
要进行检查,请转到客户端并显示一些变量:

SHOW VARIABLES LIKE 'character_set%';

验证它们是否都是
utf8
,除了
..\u filesystem
,它应该是
binary
..\u dir
,指向MySQL安装中的某个位置。

字符集是数据库(默认)和表的属性。 您可以看看(MySQL命令):

换言之;检查或更改数据库字符集非常容易:

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 

我在这里发现了这个想法:在页面底部的第一条/唯一一条用户评论中。他提到跳过字符集客户端握手有一定的重要性。

将数据库连接设置为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的一个子集(只允许三个字节或更小的字符)


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

能够找到解决方案。按照在处指定的方式运行以下操作


简短的回答是:在4个位置使用
utf8mb4

  • 客户端中的字节是utf8,而不是latin1/cp1251/etc
  • 在建立客户端到MySQL的连接时,设置名称utf8mb4
    或类似的名称
  • 所有表/列上的字符集utf8mb4
    ——严格为ascii/hex/国家/地区代码/邮政编码/等的列除外
  • 如果要输出到HTML。(是的,这里的拼写不同。)
)

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

编辑


除了包含“所有”世界字符的
字符集utf8mb4
排序规则utf8mb4\u unicode\u 520\u ci
是值得商榷的“最佳全面”排序规则。(还有土耳其语、西班牙语等,供那些希望了解这些语言细微差别的人使用。)

您的答案是您可以通过MySql设置进行配置。在我的回答中,可能有一些不符合上下文的内容,但这也有助于您。
如何配置
字符集
排序规则

对于使用默认MySQL字符集存储数据的应用程序 和排序规则(
latin1,latin1\u swedish\u ci
),无特殊配置 应该是需要的。如果应用程序需要使用 不同的字符集或排序规则,可以配置字符集 通过以下几种方式提供信息:

  • 为每个数据库指定字符设置。例如,应用程序 使用一个数据库的应用程序可能需要
    utf8
    ,而 使用其他数据库可能需要sjis
  • 在服务器启动时指定字符设置。这会导致服务器崩溃 为所有不进行其他设置的应用程序使用给定设置 安排
  • 如果您构建MySQL,请在配置时指定字符设置 来源。这将导致服务器对所有服务器使用给定的设置 应用程序,而无需在服务器启动时指定它们
此处显示的示例用于设置utf8字符集,此处还提供了设置排序规则的帮助(
utf8\u general\u 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
要查看应用于连接的字符集和排序规则系统变量的值,请使用以下语句:


这可能是一个冗长的答案,但有所有的方法,你可以使用。希望我的回答对你有帮助。有关详细信息,请在mysql>提示符下键入以下命令,将数据库本身的字符集编码更改为UTF-8。使用
alterdatabase
。。将DBNAME替换为数据库名称:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

这是此问题的重复

数据库排序规则设置为
UTF-8
然后应用
表排序规则
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
$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());