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

2on*_*ne2 5 php mysql database utf-8

我试图用我的数据库中的重音安全西班牙语单词,但它不会工作,我已经尝试过:

1)将表和行的连接更改为utf8_spanish_ciutf_unicode_ci.

2)添加标头标签

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)

3)加入

header("Content-Type: text/html;charset=utf-8");
Run Code Online (Sandbox Code Playgroud)

在一个PHP标签.

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

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

    private function Connect()
    {
        //$this->settings = parse_ini_file("settings.ini.php");
        try 
        {
            # Read settings from INI file, set UTF8
            $this->pdo = new PDO('mysql:host=localhost;dbname=xxxxx;charset=utf8', 'xxxxx', 'xxxxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

            # We can now log any exceptions on Fatal error. 
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            # Disable emulation of prepared statements, use REAL prepared statements instead.
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

            # Connection succeeded, set the boolean to true.
            $this->bConnected = true;
        }
        catch (PDOException $e) 
        {
            # Write into log
            echo $this->ExceptionLog($e->getMessage());
            die();
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:

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

Daw*_*žan 6

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

我会推荐这个配置:

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

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

    SET CHARACTER SET 'utf8'
    SET NAMES 'utf8'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用HTTP标头和/或HTML元标记设置页面的字符集.其中一个就足够了.使用utf-8charset.

这应该足够了.

如果要对西班牙语字符串进行适当的排序,请为整个数据库设置排序规则.utf8_spanish_ci应该工作(ci意味着不敏感).如果没有适当的整理,重音西班牙语字符将始终排序.

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

字符集如何在数据库中工作

  • 对象具有字符集属性,可以显式设置或继承(服务器>数据库>表>列),因此最好的选择是为整个数据库设置它

  • 客户端连接还有一个字符集属性,它告诉数据库您要发送数据的编码

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

因此,如果你有数据utf8,但客户端连接设置为latin1,数据库将破坏数据,因为它会尝试转换utf8它的类似latin1.