繁体   English   中英

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

[英]Turkish character issue while inserting into MySQL database with PHP

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

我将以下所示的行放入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. 数据库: çşığüÖÇŞİĞÜ

案例2

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

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

(Php 5.4.17,MySQL 5.6.13)

这个问题听起来像您错过了在某处指定字符编码的问题。 要解决这个问题,只需确保将所有字符编码都设置为utf-8 (实际上并不需要是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-土耳其语字符

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

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

我认为您使用过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>

您应该在对该表进行任何查询之前添加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。

我只解决了

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

非常感谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM