【发布时间】:2015-12-14 15:04:38
【问题描述】:
我正在尝试在我的数据库中插入包含扫描字母的网址,例如:
ÄÖäöÅå
我正在使用:
- Opensuse 13.2 64 位 Linux 和 MariaDB。
- MySQL 服务器版本:5.5.44-MariaDB openSUSE 包
- PHP 版本为 5.4.20
当我尝试插入时,我收到以下错误消息:
不正确的字符串值:'\xC4HK\xD6.
此查询确认字符集和排序规则设置正确:
if (mysql_query("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci")) {
echo "Character set OK !";
}
我的 MySQL 查询适用于除包含扫描字母的 URL 之外的所有内容:
if (mysql_query("INSERT INTO `table` (`address`) VALUES ('$URL')")){
$insertCount++;
echo "<br> insertcount = ".$insertCount."<br>";
} else {
echo "MySQLerror = ".mysql_error()."<br>"; // Show MySQLerror
这是来自 MariaDB 的 MySQL 信息,显示所有内容都设置为 utf8mb4:
MariaDB [(none)]> 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_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0,00 sec)
我怎样才能正确插入扫描字母?
编辑
@Monty:这些是我的数据库设置:
MariaDB [(none)]> show variables like '%colla%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0,00 sec)
MariaDB [(none)]> show variables like '%charac%';
+--------------------------+------------------------------+
| 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 |
| character_sets_dir | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0,00 sec)
MariaDB [(none)]>
编辑
@Rick James:这是我回来的:
MariaDB [db]> SHOW CREATE TABLE table;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table | CREATE TABLE table (
addr varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (addr),
UNIQUE KEY addr (addr)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='List' |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)
MariaDB [数据库]>
【问题讨论】:
-
如果可以的话,你应该stop using
mysql_*functions。他们是officially deprecated。 These extensions 已在 PHP 7 中删除。请了解 prepared statements,并考虑使用 PDO,it's really not hard。 -
+Jay Blankhard 我还没有达到阻止 SQL 注入的程度,但是一旦我解决了这个问题,我就会这样做。谢谢老兄。
-
你确认你的PHP文件保存为utf-8了吗?
标签: php mysql sql-insert collation