我无法理解什么是问题。 我用php和utf-8问题将数据写入mysql
以HTML形式书写Binəqədir。 Çiçəkqəs
Writed database Bin?q?di r。 ÃÆ'Æ••••••••
当我在插入和更新查询 Writed database Bin?q?di r。 Çiç?k q?s 手动将数据直接写入数据库,并使用选择中的 我该如何解决?使用UTF-8 INSERT 和更新。
这是我的插入代码 注意:此问题在Linux和OSX上。在windows工作的商品。我如何修复它用于linux托管?mysqli_set_charset($conn,"utf8");
时
mysqli_set_charset($conn,"utf8");
正常工作。 public function insert($sql) {
$conn = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
mysqli_set_charset($conn,"utf8");
// $conn->set_charset("utf8"); use same this.
if ($conn->query($sql) === TRUE) {
return 1;
} else {
return 0;
}
$conn->close();
}
答案 0 :(得分:4)
试
AddDefaultCharset utf-8
或在你的php文件中使用
header( 'content-type: text/html; charset=utf-8' );
并尝试
default_charset = "utf-8";
你的php.ini
你也可以试试
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-client-handshake = false #force encoding to uft8
character-set-server=utf8
collation-server=utf8_general_ci
[mysqld_safe]
default-character-set=utf8
在你的my.ini中重新启动mysql恶魔
答案 1 :(得分:1)
请考虑所有这些:
在您提出疑问之前,请执行以下操作:
$conn->query('SET NAMES utf8');
确保您的文件编码为utf8(不是html编码)。我的意思是IDE正在使用的文件编码。
确定你的桌子字符集
答案 2 :(得分:0)
这显然是well-known issue的副本,但由于赏金而无法标记为关闭。所以,清单:
utf8mb4
$conn->set_charset("utf8mb4");
header("Content-Type: text/html;charset=utf8");
或在Web服务器配置中进行设置。答案 3 :(得分:0)
尝试使用套装名称
public function insert($sql) {
$conn = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// $conn->set_charset("utf8");
$conn->query("SET NAMES 'utf8'");
if ($conn->query($sql) === TRUE) {
return 1;
} else {
return 0;
}
$conn->close();
}
来自MySQL(http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html):
SET NAMES
表示客户端将用于将SQL语句发送到服务器的字符集。因此,SET NAMES 'cp1251'
告诉服务器,“来自此客户端的未来传入消息是字符集cp1251。”它还指定了服务器用于将结果发送回客户端的字符集。 (例如,如果使用SELECT语句,它指示要用于列值的字符集。)
SET NAMES 'charset_name'
语句等同于这三个语句:
SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;
将character_set_connection设置为charset_name也会隐式将collation_connection设置为charset_name的默认排序规则。没有必要明确设置该排序规则。要指定特定的排序规则,请使用可选的COLLATE
子句:
SET CHARACTER SET
与SET NAMES
类似,但将character_set_connection和collation_connection设置为character_set_database和collation_database。 SET CHARACTER SET charset_name
语句等同于这三个语句:
SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET collation_connection = @@collation_database;
设置collation_connection还隐式将character_set_connection设置为与排序规则关联的字符集(相当于执行SET character_set_connection = @@ character_set_database)。没有必要显式设置character_set_connection。
我的观点是,在某些时候,使用存储过程时没有指定字段描述的正确字符集。再次检查您的数据库/表/字段是否具有字符集 utf8_general_ci
来自MySQL(http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html):
示例:假设column1
被定义为CHAR(5) CHARACTER SET latin2
。如果您没有说SET NAMES
或SET CHARACTER SET
,那么对于SELECT column1 FROM t
,服务器会使用客户端连接时指定的字符集发回column1
的所有值。另一方面,如果在发出SELECT语句之前说SET NAMES 'latin1'
或SET CHARACTER SET latin1
,服务器会在发回结果之前将latin2值转换为latin1。如果两个字符集中都没有字符,则转换可能会有损。
答案 4 :(得分:0)
您显示的乱码似乎涉及多个错误。 Çiç
,当Mojibaked to latin1给出Çiç
时。
请提供SELECT col, HEX(col) FROM ...
表示“不好”的内容。
同时,您对存储过程的回复 - 执行SHOW CREATE PROCEDURE ...
并检查创建过程时有效character set
的内容。 可以成为问题的一部分。 (我注意到你提到的这个十年前的错误报告没有考虑到这方面。)