【问题标题】:Turkish character issue while inserting into MySQL database with PHP使用 PHP 插入 MySQL 数据库时出现土耳其字符问题
【发布时间】:2015-02-27 11:11:15
【问题描述】:

我无法插入包含土耳其语字符的字符串。我正在尝试将“öçşığüÖÇŞİĞÜ”作为字符串插入。

我把下面的行放到了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. php: $name = $json['name'];
  2. 浏览器: öçşığüÖÇÅİÄÜ
  3. 数据库: çşığüÖÇŞİĞÜ

案例 2

  1. php: $name = iconv("UTF-8", "ISO-8859-9", $json['name']);
  2. 浏览器: öçşığüÖÇŞİĞÜ 
  3. 数据库: çþýðüÖÇÞÝÐÜ

“1”是我分配的字符串类型,“2”是“echo $user->get_name();”的结果取决于“1”处的分配,“3”是数据库单元格中的值。我可以在 CASE 2 中的“echo”中得到真实的结果,但损坏的结果被插入到数据库中。我的数据库排序规则是:“utf8_turkish_ci”。

(PHP 5.4.17,MySQL 5.6.13)

【问题讨论】:

    标签: php mysql character-encoding collation


    【解决方案1】:

    如果您使用 utf-8,则不会出现此问题。

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

    【讨论】:

      【解决方案2】:

      我只解决了

      • 删除 iconv() 转换
      • 用“header('Content-Type: text/html; charset=utf-8');”替换之前的标题由其他成员如上所示。

      非常感谢。

      【讨论】:

        【解决方案3】:

        您应该在对该表的任何查询之前添加 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】:

          我认为你使用的是 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>
          

          【讨论】:

          • 此解决方案将 null 插入 db。另一方面,回声给出“?”问号而不是每个字符。
          【解决方案5】:

          这个问题听起来像是您错过了在某处指定字符编码。要解决这个问题,只需确保您已将字符编码设置为 utf-8everywere(它实际上并不需要是 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" ...>
            

          或者在这里查看微笑问题。 MYSQL - Turkish character

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-02
            • 1970-01-01
            • 2012-05-13
            • 2016-02-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多