synology.forum архив спільноти · 2005–2022
ai.synology.forum →
ГлавнаяВеб Сервер + PHP / MySQL › Работа с MySQL в кодировке UTF8

Работа с MySQL в кодировке UTF8

USSyno · 23.10.2012

Не могу понять где ломается кодировка при записи данных в таблицу БД.

Написал пробный скрипт, файл в кодировке UTF8 без BOM.

База и таблица сгенерирована в SYNOLOGY с помощью phpmyadmin.

Структура таблицы

-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
-- Хост: localhost
-- Время создания: Окт 23 2012 г., 14:32
-- Версия сервера: 5.1.49
-- Версия PHP: 5.3.15
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

-- База данных: `test2`
-- --------------------------------------------------------
-- Структура таблицы `test_form`

CREATE TABLE IF NOT EXISTS `test_form` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `text` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4;

 

Содержимое скрипта:

 

<?echo "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">";
echo "\n<html>
<head>
<meta content='text/html; charset=utf-8' http-equiv='content-type'>";
echo "\n<title>testpage тестовая</title>";
echo "\n</head>";
echo "\n<body>";

$DBServer = "localhost";
$DBName   = "test2"; 
$DBUser   = "test2"; 
$DBPas    = "123456";

function BaseConnect()
{
  global $DBServer,
         $DBName,
         $DBUser,
         $DBPas;
  $connection = @mysql_Connect($DBServer,$DBUser,$DBPas);
  mysql_select_db($DBName);
  mysql_query('SET NAMES utf8');
  mysql_query('SET CHARACTER SET utf8');
  return $connection;
}

$connection= BaseConnect();
$test_bd = @mysql_Connect($DBServer,$DBUser,$DBPas); // проверка доступности сервера БД
Echo "test bd: [".$test_bd."]";


$LogCount = 0;

if($_GET['mode']=='update')
{
  $sql = "update `test_form` set
          `name` ='".$_POST['form_name']."',
          `text` ='".$_POST['form_text']."'
          where `id` ='".$_GET['update_id']."'";
  $result_id  = mysql_query($sql);
  echo "выполняем обновление базы. запрос:".$sql;
}

if($_GET['mode']=='add')
{
  $sql = "insert into `test_form` (`id`,`name`,`text`) VALUES (NULL,'".$_POST['form_name']."','".$_POST['form_text']."')";
  $result_id  = mysql_query($sql);
  echo "выполняем запись в базу. запрос:".$sql;
}

$sql="select * from `test_form` order by `id`";
$result = mysql_query($sql);
$Count = mysql_NumRows($result);
while ($Log_array = mysql_fetch_array($result))
{
  $LogCount++;
  echo "<br>запись № ".$LogCount." id[".$Log_array['id']."]";
  echo "<form action='index.php?mode=update&update_id=".$Log_array['id']."' enctype='multipart/form-data' method='post'>";
  echo "<input type='text' name='form_name' value='".$Log_array['name']."'>
<br><textarea name='form_text' cols='100' rows='5' >".$Log_array['text']."</textarea>
<br><button type='submit' title='нажми'>обновить</button>";
  echo "</form>";
}

  echo "<br>запись новая";
  echo "<form action='index.php?mode=add' enctype='multipart/form-data' method='post'>";
  echo "<input type='text' name='form_name' value=''>
<br><textarea name='form_text' cols='100' rows='10' ></textarea>
<br><button type='submit' title='нажми'>добавить</button>";
  echo "</form>";
  
echo "\n</body>\n</html>";
?>

 

При работе получаю вместо руских символов знаки вопроса.

У хостера и на Денвере этот пример работает без знаков вопроса.

С другой стороны phpmyadmin в SYNOLOGY вполне нормально работает с формами и пишет в таблицы.

 

Что я делаю в скрипте не правильно для SYNOLOGY?

USSyno · 24.10.2012
База и таблица сгенерирована в SYNOLOGY с помощью phpmyadmin.

 

Причина и решение проблемы нашел. Имхо.

Устройство SYNOLOGY DS212+ система DSM 4.1-2647.

Все упоминания относятся к выше указанной конфигурации.

Возможно и в других конфигах ситуация аналогична.

 

Причина:

При создании базы посредством phpmyadmin (через заведение пользователя) запрос на требуемую кодировку базы не задается. Либо я не заметил такой опции.

По умолчанию базы создаются в кодировке в latin1_swedish_ci.

Выше указанный пример имел базу в latin1_swedish_ci.

 

Решение:

Даже если уже создана база в кодировке в latin1_swedish_ci и в нее загружены данные в кодировке utf8_general_ci, то достаточно выполнить SQL команду:

ALTER DATABASE `mybase` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

Команду можно отправить через интерфейс phpmyadmin или внешним менеждером sql.

Я использовал виндовый HeidiSQL.

Есть и другии способы решить проблему, (я их не пробовал):

в my.ini прописать в секции [mysqld]: character-set-server=utf8,

зайдя на NAS через Telnet или SSH выполнить команду mysql,

но они требуют определенных знаний и навыков.

 

Кстати дамп из HeidiSQL показывает в какой кодировке наша база. Да и скорость работы по сравнению с phpmyadmin весьма комфортна.

ayulit · 03.03.2014

Может быть не совсем в тему, но тоже столкнулся с похожей проблемой.

 

Установил на Windows 7 Apache 2.2.18 (Win32) PHP 5.2.16 MySQL 5.5.36 phpMyAdmin 4.0.8.

 

На главной странице phpMyAdmin в разделе Сервер баз данных стояла Кодировка сервера: UTF-8

 

Через средство phpMyAdmin посредством sql запроса хотел создать БД, в ней таблицу и наполнить её данными на русском языке.

 

Скрипт был в UTF-8 (без BOM)

CREATE DATABASE books;

USE books;

CREATE TABLE publishers
( id_publ INTEGER(5) PRIMARY KEY  auto_increment,
  name_publ VARCHAR(50)
);

INSERT INTO publishers (name_publ) VALUES ("Питер");

 

Занесение данных прервалось ошибкой вида

 

#1366 - incorrect string value '\xD0\x9D\xD0\xB0\xD0\xB7...' for column 'name_publ' at row 1

 

Стало ясно, что что-то не так с кодировкой, я проверил и в действительности в phpMyAdmin latin1_swedish_ci у созданной таблице publishers для поля name_publ стоял параметр Сравнение latin1_swedish_ci.

 

РЕШЕНИЕ

 

1. Остановить службу MySQL

2. В папке с MySQL в файле my.ini найти строки

...
default-character-set=
...
character-set-server=
...

 

3. Заменить в них latin1 на utf8 (странно что в конфигурационном файле стоит latin1, если, как я писал выше, phpMyAdmin показывает Кодировка сервера: UTF-8, ну да ладно)

 

4. Сохранить и закрыть my.ini и запустить службу MySQL

 

Далее если создавать таблицу скриптом в уже созданной базе, то поля VARCHAR будут по прежнему создаваться в кодировке latin1_swedish_ci, поэтому я удалил базу и запустил весь скрипт заново. После этого параметр Сравнение для таблиц выставляется utf8_general_ci и можно спокойной заполнять таблицы данными русскими буквами в в UTF :)

cannabis-tob · 26.06.2014

Сегодня вылетала прошика RS810RP+ на нем стоял сайт после переустановки прошики (с 4.3 на 4.4) восстановил все настройки данный сайт начал отображаться с кривой кодировкой http://s020.radikal.ru/i715/1406/f7/f35ac24c1ca2.png

 

Плохо понимаю что делать так как знания не велики прошу вас помочь

Accelerator · 26.06.2014

DSM версии 4.4 не существует в природе. Что вы обновили?

cannabis-tob · 27.06.2014
DSM версии 4.4 не существует в природе. Что вы обновили?

 

 

Извиняюсь ошибся нынешняя версия 5.0

Accelerator · 27.06.2014

В версии 5.0 заменили Mysql на MariaDB.

Отсюда проблемы.

Как победить - не знаю, так как так и не перешел ан 5.0

Я бы откатился на 4.3

cannabis-tob · 27.06.2014

При откате файлы не теряются?

Accelerator · 27.06.2014

Это зависит от того где у вас файлы.

Если в системном разделе, то теряются. Если на разделе данных, то нет.

Но техподдержка всё-равно рекомендует сделать бэкап при любых переустановках DSM во избежание.