2015-08-08 92 views
2

我试图在MySQL表格中插入西里尔文的值,但编码时出现问题。MySQL和PHP:使用西里尔文字符的UTF-8

PHP的:

<?php 

$servername = "localhost"; 
$username = "a"; 
$password = "b"; 
$dbname = "c"; 

$conn = new mysqli($servername, $username, $password, $dbname); 

mysql_query("SET NAMES 'utf8';"); 
mysql_query("SET CHARACTER SET 'utf8';"); 
mysql_query("SET SESSION collation_connection = 'utf8_general_ci';"); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "UPDATE `c`.`mainp` SET `search` = 'test тест' WHERE `mainp`.`id` =1;"; 

if ($conn->query($sql) === TRUE) { 
} 
$conn->close(); 

?> 

的MySQL:

| id | search |    
| 1 | test ав | 

注:PHP文件utf-8,数据库归类utf8_general_ci

+1

你需要停止使用'的mysql_query()' - PHP的'mysql_xxx()'函数已被替换:你应该使用的'mysqli'或'PDO'库代替。他们都应该让这种事情更容易处理。 – Spudley

+0

应该是你的修复以及http://stackoverflow.com/questions/25286279/storing-german-special-characters-into-mysql-database – Jester

回答

20

您在这里混合APIs,mysql_*mysqli_*不混合。您应该坚持使用mysqli_(因为您似乎无论如何),因为mysql_*函数已被弃用,并且完全在PHP7中删除。

您的实际问题是某处出现字符集问题。以下是一些可帮助您为应用程序获取正确字符集的指针。这涵盖了开发PHP/MySQL应用程序时可能面对的一般问题的大部分

  • ALL属性在整个应用程序必须设置为UTF-8
  • 将文档保存为UTF-8 W/O BOM(如果你使用记事本+ +,这是Format - >Convert to UTF-8 w/o BOM
  • 在PHP和HTML报头应设置为UTF-8

    • HTML(内侧<head></head>个标签):

      <meta charset="UTF-8"> 
      
    • PHP(在你的文件的顶部,任何输出前):

      header('Content-Type: text/html; charset=utf-8'); 
      
  • 在连接到数据库,设置字符集为UTF -8为您的连接对象,像这样(直接连接后)

    mysqli_set_charset($conn, "utf8"); /* Procedural approach */ 
    $conn->set_charset("utf8");  /* Object-oriented approach */ 
    

    这是mysqli_*,也有类似的mysql_*和PDO(见本答案的底部)。

  • 另外,还要确保你的数据库和表设置为UTF-8,你可以做这样的:

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
    

    (已存储将不被转换为正确的字符集的任何数据,因此你需要用一个干净的数据库来做到这一点,或者如果存在破碎的字符,则在更新数据后更新数据)。

  • 如果您使用json_encode(),您可能需要应用JSON_UNESCAPED_UNICODE标志,否则将特殊字符转换为相应的十六进制等价的。

记住一切在代码的整个管道需要被设置为UFT-8,否则,你可能在你的应用体验破字。

除了这个列表,还可能有一些函数具有用于指定字符集的特定参数。手册会告诉你这个(例子是htmlspecialchars())。

还有多字节字符的特殊功能,例如:strtolower()不会降低多字节字符,因此您必须使用mb_strtolower(),请参阅此live demo

注1:请注意,其某处标注为utf-8(以短划线),以及作为某处utf8(没有它)。知道何时使用哪些是很重要的,因为它们通常不可互换。例如,HTML和PHP想要utf-8,但MySQL不。

注2:在MySQL中,“charset”和“collat​​ion”不是同一回事,请参阅Difference between Encoding and collation?。两者都应该设置为utf-8;一般对照应为utf8_general_ciutf8_unicode_ci,请参阅UTF-8: General? Bin? Unicode?

注3:如果您使用的表情符号,MySQL的需要与utf8mb4字符集,而不是标准utf8指定,无论是在数据库和连接。 HTML和PHP将只有UTF-8


设置UTF-8 mysql_和PDO

  • PDO:这是在你的对象的DSN完成。注意charset属性,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass"); 
    
  • mysql_:这样做是非常相似的mysqli_*,但它并不需要的连接对象作为第一个参数。

    mysql_set_charset('utf8'); 
    
+1

这是我的答案: $ conn-> set_charset(“ UTF8" ); 谢谢! – nurp

+0

字符集现在可以在HTML中用设置 – DarkBee

2

解决方案:

mysql_query("SET NAMES 'utf8';");>$mysqli->set_charset('utf8');