24.05.2018 17:10
OlegON
 
"Век живи - век учись".
В свое время перевернул форум в UTF-8, просто воткнул во все возможные места, где-то "utf-8", где-то "utf8". Путаница еще та. Выяснилось, что при сохранении символы расширенного UNICODE (за пределами BMP - Basic Multilingual Plane) просто выкидываются. Например, такое
💩
в базу поместить было нельзя. Нельзя сказать, что я был этим просто потрясен, однако периодически за все полгода, что я это терпел, порывался найти место, где это не работает. Собственно, что виновата база, я нашел только значительно позднее, обвиняя PHP. Вот он не виноват. В PHP UTF-8 подразумевает нормальный юникод, в т.ч. 4-байтный. А в мускуле (MySQL/MariaDB) это исключительно трехбайтная кодировка. Т.е. большинство emoji, например, идут лесом, обрезаясь и превращаясь в вопросики. Я пробовал разные варианты, в том числе с экранированием, но в случае с уже написанным форумом это повлекло такую лавину связей в коде, что я сложил руки и решил включить 4 байта в MariaDB.

Для начала правим my.conf
Код:
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
не забываем перезапустить. Проверяем
Код:
mysql> 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)
Включаем кодировку по умолчанию
SQL код:
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
Дальше для каждой таблицы необходимо выполнить
SQL код:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
Собственно, можно еще для каждой колонки озаботиться
SQL код:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
Но конвертировать, собственно, нечего, поскольку значение наследуется от таблицы.

Я себе скриптик собрал для переворачивания всех таблиц
Код:
mysql --skip-column-names --silent -e"SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'имя_базы' AND table_collation = 'utf8_general_ci'" | xargs -I{} mysql имя_базы -e"ALTER TABLE {} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
Собственно, нюансов одновременно и очень много в целом, и достаточно мало тех, с которыми вы столкнетесь. Из основных - нельзя сделать общий FULLTEXT индекс на столбцы с разной кодировкой. На некоторых таблицах размерность (а она все так же в байтах считается) может не влезть в четырехкратное увеличение. У меня такие таблицы были в пределах BMP по содержимому, потому я вообще оставил их в utf8.
30.11.2018 22:02
telesoft
 
Вот прямо сейчас именно эта проблема.

У меня база данных mysql от опенкарта. В ней как бы все хорошо
В ней есть название товара. Товар состоит из русских букв и английских
И в ней все хорошо

Написал я мобильное приложение на Android (не спрашивай меня как).

Залил на свой сайт *.php файл.

<?php
$host = 'a*************8.mysql.mchost.ru';
$db = 'a*******8_bazakomp';
$user = 'a********98_bazakomp';
$pass = '************';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
//var_dump($_REQUEST);
$stmt = $pdo->prepare('SELECT * FROM AllSKU WHERE ShtrichKod = ?');
$stmt->execute([$_POST['ShtrichKod']]);
foreach ($stmt as $row)
{
echo $row['ShopSKU']." - ".$row['NameSKU'];
}
?>


И возвращает он мне в Андроид знаки вопроса))) А все, что на английском языке - все ОК....

Что сделать чтобы в Андроиде видеть русские буквы!!!!
30.11.2018 22:26
OlegON
 
А с чего ты решил, что он тебе возвращает в Андроид знаки вопроса? Может, это андроид тебе знаки вопроса показывает? В браузере на компе этот PHP нормально отображает? В заголовках страницы указано, что это UTF8?
30.11.2018 22:39
telesoft
 
Чтобы дернуть "браузером" нужно чтобы сделать запрос "Get"
Ну или как там - я не знаю....

Типа просто так это нельзя сделать. Если ты можешь - проверь
На вход надо подать штрих код товара 2722449000028
30.11.2018 22:48
OlegON
 
GET подразумевает, что ты какому-то параметру назначаешь какое-то значение. Значение ты указал, а параметр предлагаешь угадать? :)
Например строка https://olegon.ru/showthread.php?t=29452
это GET t=29452
01.12.2018 00:17
telesoft
 
Нет ни гет
Типа Push Запросы
Или еще какие то запросы которые простой браузер отправить не может....
Твоя почта olegon собака olegon точка ру?

Я туда пришлю вопрос. Просто там пароль))))
01.12.2018 08:10
OlegON
 
Давай лучше тут, пароли не надо, ты сначала разберись, что нужно твоему приложению, подумаем потом, как добыть это в вебе.
01.12.2018 15:44
telesoft
 
1. Есть БД на MySql (см. картинку)
В ней есть несколько записей, в том числе «штрихкод – 2722449000028» = «Кресло коляска Ergoforce Е 0811 20»


2. Есть приложение на андроид, которое дергает php файл на сервере.
3. Ниже php файл. Тут пароли и логины заменены **************

<?php
$host = '*****************.mysql.mchost.ru';
$db = '*****************_bazakomp';
$user = '*****************_bazakomp';
$pass = '*****************';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
//var_dump($_REQUEST);
$stmt = $pdo->prepare('SELECT * FROM AllSKU WHERE ShtrichKod = ?');
$stmt->execute([$_POST['ShtrichKod']]);
foreach ($stmt as $row)
{
echo $row['ShopSKU']." - ".$row['NameSKU'];
}
?>

4. Все работает сравнительно не-плохо.
В андроид возвращается ????????????????? Ergoforce Е 0811 20 (см. картинку).
01.12.2018 15:48
telesoft
 
Картинки ниже
Миниатюры
Нажмите на изображение для увеличения
Название: android.jpg
Просмотров: 320
Размер:	22.2 Кб
ID:	9799   Нажмите на изображение для увеличения
Название: Коляска.jpg
Просмотров: 341
Размер:	51.8 Кб
ID:	9800  
01.12.2018 16:20
telesoft
 
Понятно, что единственное что меня не устраивает - это ????????? вместо кириллицы.

Насколько я понимаю твой пост, пишешь ты именно об этом вот...
Часовой пояс GMT +3, время: 02:13.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.