用PHP插入MySQL数据库时的土耳其字符问题

时间:2014-12-31 10:29:40

标签: php mysql character-encoding collation

我在插入包含土耳其字符的字符串时遇到问题。我想插入“öçşığüÖÇŞİĞÜ”作为字符串。

我把下面指出的行放到php文件的头部:

header("Content-Type: text/html; charset=windows-1254");

我从ajax获取数据(虽然它并不重要,我写了)

$json = filter_input_array(INPUT_POST);

这是插入命令:

$query = "INSERT INTO users (name) VALUES ('" . $user->get_name() . "')";

现在,我尝试了两种为变量赋值的案例:

案例1

  1. php: $ name = $ json ['name'];
  2. 浏览器:öçşığüÃ-ÇÅÄ°ÄÃœ
  3. 数据库:çşığüÃ-ÇŞİĞÜ
  4. 案例2

    1. php: $ name = iconv(“UTF-8”,“ISO-8859-9”,$ json ['name']);
    2. 浏览器:öçşığüÖÇŞİĞÜ
    3. 数据库:çþýðüÖÇÞÝÐÜ
    4. “1”是我的字符串分配类型,“2”是“echo $ user-> get_name();”的结果。取决于“1”处的赋值,“3”是数据库单元格中的值。我可以在CASE 2中获得“echo”中的真实结果,但是将损坏的结果插入到数据库中。我的DB校对是:“utf8_turkish_ci”。

      (PHP 5.4.17,MySQL 5.6.13)

5 个答案:

答案 0 :(得分:3)

这个问题听起来像你错过了在某处指定字符编码。为了解决这个问题,只需确保你已经将字符编码设置为 utf-8 everywere (它实际上不需要是utf-8,只是相同的到处都是 - 但如果你搞砸了某些事情并且需要改变一些地方,我强烈建议使用utf-8):

  • 告诉MySQL使用utf-8。为此,请将此添加到my.cnf:

    collation_server = utf8_unicode_ci
    character_set_server = utf8
    
  • 在与mysql交互之前,发送这两个查询:

    SET NAMES 'utf8';
    CHARSET 'utf8';
    

    或者,让php在打开连接后执行此操作:

    mysql_set_charset('utf8', $conn);
    
  • 将UTF-8设置为数据库的默认字符集

    CREATE DATABASE `my_db` DEFAULT CHARACTER SET 'utf8';
    
  • 对表格执行相同的操作:

    CREATE TABLE `my_table` (
      -- ...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
  • 假设客户端是浏览器,请将您的内容作为utf-8和正确的标头提供:

    header('Content-type: text/html; charset=utf-8');
    

    要确定浏览器能够理解,请添加元标记:

    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    
  • 最后但并非最不重要的是,告诉浏览器使用utf-8提交表单

    <form accept-charset="utf-8" ...>
    

或者查看smiler问题。 MYSQL - Turkish character

答案 1 :(得分:2)

如果你使用utf-8,这个问题就不会发生了。

我的建议是将编码转换为utf8。

答案 2 :(得分:1)

我认为您使用了utf 8,请尝试

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

在mysql部分你必须使用

mysql_query("set names 'utf8'");

示例php

<html>
    <head>
        <title>Title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "select name from users";
            //........
            //........
            //echo "abc";           
    ?>    

    </body>
<html>

答案 3 :(得分:1)

您应该在对此表的任何查询之前添加MySQL查询:

SET NAMES 'utf8_turkish_ci' / SET NAMES 'ISO-8859-9'

$params = [
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'ISO-8859-9\'',
];
$pdo = new PDO($dsn, $username, $passwd, $params];

不要使用iconv。

答案 4 :(得分:0)

我只解决了

  • 删除iconv()转化
  • 用&#34;标题替换上一个标题(&#39; Content-Type:text / html; charset = utf-8&#39;);&#34;如上文其他成员所述。

非常感谢。