如何处理数据库中的重音和奇怪的字符?

时间:2015-10-19 17:00:13

标签: php mysql database utf-8

我试图在我的数据库中使用重音来保护西班牙语单词,但它不起作用,我已经尝试过:

1)将表格和行的连接更改为(n+1) . (1/(n+1))utf8_spanish_ci

2)添加带

的标头标签
utf_unicode_ci.

3)添加

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

在php标签中。

在我的笔记本电脑的xampp服务器中执行此操作会有效,但是当我将数据库上传到登录怪物服务器时,它不会正确保存重音。

编辑:这是我正在使用的连接:

header("Content-Type: text/html;charset=utf-8");

编辑:

我无法保存口音,它显示像á=á

这样的奇怪字符

4 个答案:

答案 0 :(得分:5)

排序仅影响文本排序,对存储数据的实际字符集没有影响。

我会推荐这种配置:

  1. 仅设置整个数据库的字符集,因此您不必分别为每个表设置它。字符集从DB继承到表到列。使用utf8作为字符集。

  2. 设置数据库连接的字符集。连接到数据库后执行这些查询:

    SET CHARACTER SET 'utf8'
    SET NAMES 'utf8'
    
  3. 使用HTTP标头和/或HTML元标记设置页面的字符集。其中一个就足够了。使用utf-8作为charset

  4. 这应该足够了。

    如果要对西班牙语字符串进行适当排序,请为整个数据库设置 collat​​ion utf8_spanish_ci应该有效(ci表示不区分大小写)。如果没有适当的整理,重音西班牙语字符将始终排序。

    注意:表中已有的数据字符集可能已损坏,因为之前字符集配置错误。您应首先使用某个数据库客户端进行检查以排除此情况。如果它坏了,只需使用正确的字符集配置重新插入数据。

    character set如何在数据库中工作

    • objects有一个字符集属性,可以明确设置或继承(服务器&gt;数据库&gt; table&gt;列),所以最好的选择是为整个数据库设置它

    • client connection还有一个字符集属性,它告诉数据库你要发送数据的编码

    如果客户端连接和目标对象的字符集不同,则发送到数据库的数据会自动从连接的字符集转换为对象的字符集。

    因此,如果您有utf8中的数据,但客户端连接设置为latin1,则数据库将中断数据,因为它会尝试转换utf8喜欢latin1

答案 1 :(得分:2)

这是我存储UTF8字符的清单。但是,请确保将存储字符串的部分的失败原因隔离到数据库中 - 这意味着要存储的字符串仍然与用户输入的字符串相同。

首先。确保正在使用的表格的字符集为utf8或更好,但使用utf8mb4来获得完整的unicode支持(尽管它也有它的缺点)。为整个数据库设置了哪个字符集并不重要;如果指定,它将被表定义覆盖。用于创建此类表的DDL代码如下:

CREATE TABLE table_name (
    id INT AUTO_INCREMENT NOT NULL,
    name VARCHAR(190) NOT NULL,
    date_created DATETIME NOT NULL,
    PRIMARY KEY(id)
)
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ENGINE = InnoDB;

其次。使用utf8字符集进行数据库连接。

// This should be enough
new PDO(
    'mysql:host=localhost;dbname=xxxxx;charset=utf8mb4;',
    'username',
    'password'
);

答案 2 :(得分:0)

For MySql在调用数据库连接后使用这些代码:

$set_utf=$dbh->exec("SET NAMES UTF8"); 

答案 3 :(得分:0)

我必须存储很多来自不同语言(包括法语和西班牙语)的强调字母,而我目前唯一安全的方法是将所有内容存储在MySQL中的utf8_ bin 中,并且像charset utf-8一样显示页面。 无需进一步处理,无论是MySQL还是PHP。

另外,请确保您的IDE使用utf8管理您的文件。