使用 php 插入 MySql 5.6 DB 时,我收到“不正确的字符串值”错误(我尝试了来自多个服务器的多个 PHP 版本,包括 v5.5 - 所有 Windows 机器)。
我已经搜索了论坛并尝试了所有方法,但似乎无法弄清楚这一点!以下是详细信息。我希望我只是缺少一些简单的东西,非常感谢任何和所有的帮助。先感谢您!
==================================================== ====================
当前 MySQL 5.6 配置(相关部分):
[client]
default-character-set = utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
服务器设置的验证:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
---------------------------------------------------
Variable_name | Value
---------------------------------------------------
character_set_client | utf8mb4
---------------------------------------------------
character_set_connection | utf8mb4
---------------------------------------------------
character_set_database | utf8mb4
---------------------------------------------------
character_set_filesystem | binary
---------------------------------------------------
character_set_results | utf8mb4
---------------------------------------------------
character_set_server | utf8mb4
---------------------------------------------------
character_set_system | utf8
---------------------------------------------------
collation_connection | utf8mb4_general_ci
---------------------------------------------------
collation_database | utf8mb4_general_ci
---------------------------------------------------
collation_server | utf8mb4_unicode_ci
---------------------------------------------------
创建数据库语句(这是我为解决此问题而严格创建的测试数据库):
CREATE DATABASE `chartest` /*!40100 COLLATE 'utf8mb4_general_ci' */
创建表语句:
CREATE TABLE IF NOT EXISTS `testtable` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`testcol` text COLLATE utf8mb4_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
测试/示例 PHP 代码:( 请注意 - 我知道我们应该使用 PDO 或 MySQLi,我们正在迁移/升级,但是我们有很多遗留代码,因此这个问题需要同时解决/ 短期使用现在已弃用的 mysql 函数)。
<?php
//Establish DB connection
$DBConnection = mysql_connect('my_db_server_IP', 'my_db_username', 'my_db_password');
if (!$DBConnection) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db('chartest', $DBConnection)) {
echo 'Could not select database';
exit;
}
//Set misc charset options in mysql
/*Note: these should not really be needed given the
character-set-client-handshake = FALSE setting in the MySQL config file.
Also, I have tried every combination of these, building
from the ground up - no luck.
I have left these in here just for the sake of being thorough */
mysql_query("SET character_set_client=utf8mb4", $DBConnection);
mysql_query("SET character_set_connection=utf8mb4", $DBConnection);
mysql_query("SET character_set_database=utf8mb4", $DBConnection);
mysql_query("SET character_set_results=utf8mb4", $DBConnection);
mysql_query("SET character_set_server=utf8mb4", $DBConnection);
mysql_set_charset("utf8mb4", $DBConnection);
mysql_query("SET CHARACTER SET utf8mb4", $DBConnection);
mysql_query("SET NAMES utf8mb4", $DBConnection);
//The query below contains a "middle dot" which is what causes the error (or at least is an example)
$SQLQuery = "INSERT INTO testtable (testcol) VALUES ('test · middle dot insert')";
//Execute query
$result = mysql_query($SQLQuery, $DBConnection);
if (!$result)
{
echo mysql_error();
exit;
}
else
{
echo 'worked - '. mysql_insert_id();
}
mysql_close($DBConnection);
?>
返回错误
不正确的字符串值:第 1 行的列“testcol”的“\xB7 中间点插入”
...再次感谢您的智慧。
==================================================== =================
编辑回复:重复问题:我已经审查了建议的重复问题/答案UTF-8 一直到,但我没有看到我缺少什么(尽管我显然必须缺少一些东西!!)。
更具体地说(根据引用的帖子),我的“数据存储”是 utf8mb4,我的“数据访问”正在使用 mysql_set_charset,我实际上并没有尝试“输出”这些字符(至少这不是我的问题),字符/SQL 查询是硬编码的——因此这个问题与任何数据的“输入”无关。最后,关于“其他注意事项”,我没有使用任何字符串函数,所以我可以说这不是一个问题。
再次,非常感谢任何反馈。谢谢。