Ошибка вставки скандальных букв в базу данных

Я пытаюсь вставить в свою базу данных веб-адреса, содержащие скандирующие буквы, например:

ÄÖäöÅå

Я использую:

  • Opensuse 13.2 64-битные Linux и MariaDB.
  • Версия MySQL Server: 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

Это информация MySQL от MariaDB, показывающая, что все установлено на 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)]>

редактировать

@ Рик Джеймс: Это то, что я получил:


MariaDB [db]> SHOW CREATE TABLE table;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table | CREATE TABLE table (
addr varchar (150) COLLATE utf8mb4_unicode_ci NOT NULL,
ОСНОВНОЙ КЛЮЧ (addr),
УНИКАЛЬНЫЙ КЛЮЧ addr (addr)
) ENGINE = MySAM CHARSET DEFAULT = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Список' |
+ -------- + ---------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------ +
1 ряд в наборе (0,00 сек)

MariaDB [дБ]>
[/ NOEDIT]

1

Решение

Попробуй это

Убедитесь, что таблицы, в которых хранятся данные, имеют набор символов utf8:

SELECT
`tables`.`TABLE_NAME`,
`collations`.`character_set_name`
FROM
`information_schema`.`TABLES` AS `tables`,
`information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations`
WHERE
`tables`.`table_schema` = DATABASE()
AND `collations`.`collation_name` = `tables`.`table_collation`
;

проверьте настройки вашей базы данных:

show variables like '%colla%';
show variables like '%charac%';

Измените utf-8 на utf8_general_ci

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
0

Другие решения

C4 и D6 — латинский гекс для Ä и Ö.

Пожалуйста, сделай SHOW CREATE TABLE чтобы увидеть, что CHARACTER SET устанавливается для рассматриваемого столбца. Я подозреваю, что это неправильно latin1,

И да, вы должны отказаться от mysql_* интерфейс.

0