在MySQL数据库中保存音调

27


我正在尝试保存数据库中的法语重音符号,但它们没有按照应有的方式保存在数据库中。
例如,“é”保存为“é”。
我尝试将文件设置为“Unicode (utf-8)”,数据库中的字段以及数据库本身都是“utf8_general_ci”。
当我使用Firebug查看通过AJAX提交的数据时,我看到重音符号以“é”传递,因此它是正确的。

谢谢,请让我知道如果您需要更多信息!

9个回答

60

在我的个人经验中,我通过在MySQL连接代码之后添加以下内容来解决了相同的问题:

个人而言,我通过在MySQL连接代码之后添加以下内容来解决相同的问题:

mysql_set_charset("utf8");

或者对于mysqli:

mysqli_set_charset($conn, "utf8");

或者使用mysqli面向对象的等效方法:

$conn->set_charset("utf8");

有时您需要通过添加以下代码来定义主PHP字符集

mb_internal_encoding('UTF-8');

在客户端 HTML 端,您需要添加以下标头数据:

<meta http-equiv="Content-type" content="text/html;charset=utf-8" />

为了使用JSON AJAX结果(例如使用jQuery),您应该通过添加以下内容定义标头:

header("Content-type: application/json;charset=utf8");
json_encode(
     some_data
);

这应该可以解决问题


3
如果你要使用PDO,请尝试以下代码:$db = new PDO("database", "username", "pass", array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))。这将设置数据库连接为UTF-8编码。 - Junior Mayhé
4
这句话的意思是,函数mysqli_set_charset("utf8")需要两个参数:连接和字符集,所以最终格式应该是 mysqli_set_charset($conn, "utf8")。请注意,这里只翻译原文,不包括任何解释或其他内容。 - Arnau Lacambra

6
最有可能的问题是您的数据库连接没有进行UTF-8编码,通常默认使用ISO-8859-1编码。

尝试发送查询语句。

SET NAMES utf8;

连接成功后。


1
我使用PHP和shell_exec命令来导入一个sql文件,这个解决方案是唯一有效的,谢谢! - Pierre

5
mysqli_set_charset($conn, "utf8");

4
如果您使用PDO,则必须像这样实例化:

如果您使用PDO,则必须像这样进行实例化:

new \PDO("mysql:host=$host;dbname=$schema", $username, $password, array(\PDO::MYSQL_ATTR_INIT_COMMAND =>  'SET NAMES utf8') );

2

使用UTF8:

在你的HTML文件中设置标签:

<meta http-equiv="Content-type" content="text/html;charset=utf-8" />   

连接到MySQL数据库时,强制编码以避免操作MySQL设置。

$conn = mysql_connect('server', 'user', 'password') or die('Could not connect to mysql server.');
mysql_select_db('mydb') or die('Could not select database.');
mysql_set_charset('utf8',$conn); //THIS IS THE IMPORTANT PART

如果您使用AJAX,请按照以下方式设置编码:
header('Content-type: text/html; charset=utf-8');

2
此扩展在 PHP 5.5.0 中已被弃用,并在 PHP 7.0.0 中被移除。 - Vipul Hadiya

1

您是否已经查看了http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

需要使用Unicode与服务器通信的客户端应相应地设置客户端字符集;例如,通过发出SET NAMES 'utf8'语句。 ucs2不能用作客户端字符集,这意味着它不能用于SET NAMES或SET CHARACTER SET。(请参见第9.1.4节“连接字符集和排序规则”。)

除此之外:

如果您通过PHP从MySQL数据库获取数据(一切都是UTF-8),但在浏览器中仍然对某些特殊字符显示“?”,请尝试以下操作:
在mysql_connect()和mysql_select_db()之后添加以下行:mysql_query("SET NAMES utf8");
这对我有用。我先尝试了utf8_encode,但它只适用于äüöéè等字符,而不适用于西里尔字母和其他字符。

0
你需要做到以下两点:a)确保你的表格使用的是能够编码这些字符的字符编码(如今常用的是UTF-8编码),b)确保你的表单提交也使用相同的字符编码发送到数据库中。你可以通过将HTML/PHP/其他文件保存为UTF-8编码,并在头部包含一个告诉浏览器使用UTF-8编码的meta标签来实现这一点。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

哦,还有别忘了 C 语言,在连接数据库时,请确保您实际上使用了正确的字符集,方法是执行 SET NAMES charset=utf8(可能不是正确的语法,我得查一下该怎么写,但大致就是这样)


0

PHP(.net)建议不要在连接MySQL后使用类似于SET NAMES utf8这样的查询来设置字符集,因为您在MySQL语句内部转义数据的功能可能无法按预期工作。

如果您正在使用PHP,不要使用SET NAMES utf8,而是使用适当的..._set_charset()函数(或方法)。


0

好的,我已经找到了适合我的工作解决方案:

运行这个mysql命令

show variables like 'char%'; 

这里有许多变量: "character_set_server", "character_set_system"等。

在我的情况下,数据库中的 "é" 表示 "é",我想在我的网站上显示 "é"。

为了使其正常工作,我必须将 "character_set_server" 的值从 "utf8mb4" 更改为 "latin1"。

所有正确的值如下:

enter image description here

其他的值包括:

enter image description here

有了这些值,错误的数据库重音会被服务器纠正并正确显示。

但每种情况可能都不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接