Я пытаюсь вставить в свою базу данных веб-адреса, содержащие скандирующие буквы, например:
ÄÖäöÅå
Я использую:
Когда я пытаюсь вставить, я получаю это сообщение об ошибке:
Неверное строковое значение: ‘\ 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]
Попробуй это
Убедитесь, что таблицы, в которых хранятся данные, имеют набор символов 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;
C4 и D6 — латинский гекс для Ä и Ö.
Пожалуйста, сделай SHOW CREATE TABLE
чтобы увидеть, что CHARACTER SET
устанавливается для рассматриваемого столбца. Я подозреваю, что это неправильно latin1
,
И да, вы должны отказаться от mysql_*
интерфейс.