Малко помощ за база данни

WinKam

Active Member
Здравейте,

сега пускам един проект и има в базата данни валути. Към 40-50. Но няма вкаран български лев. Табицата за валутите е в 3 колони. Име. Валута и Символ. Добавих Bulgarian lev BGN. А на символ сложих: лв. Но като отворя сайта символа ми го чете: ??. Как да сложа енкодинга на полето символ за да показва българските букви: лв. ?
 
От: Малко помощ за база данни

Без да споменеш каква точно система за управление на базите данни ползваш и какъв е текущия енкодинг на сайта (и дали въобще е зададен такъв), трудно ще успее някой да ти помогне.
 
От: Малко помощ за база данни

Ако не ме лъже паметта, не може да сменяш енкодинга само на един ред. На колона може, ама на запис - не.
Най-вероятно базата е Mysql. Системата която ползваш , би следвало да има начин да добавиш валута през нея.

SHOW TABLE STATUS - Това Query ще ти покаже необходимата информация - коя таблица и коя колона , какъв енкодинг ползва.
Ако искаш да пишеш директно в базата, настрои редактора с който пишеш INSERT или UPDATE заявката да ползва енкодинга на съответната колона.
 
От: Малко помощ за база данни

utf8-general ръчно сложи на цялата си таблица от данни (не база, а само на тази таблица с валутите).
 
От: Малко помощ за база данни

За MySQL, ако не ти се бара цялата таблица.
Код:
ALTER TABLE `x` MODIFY COLUMN `y` VARCHAR(50) CHARACTER SET utf-8 COLLATE utf8_general_ci DEFAULT NULL;

Иначе ти препоръчвам reload на DB и цялата да я направиш utf-8
 
От: Малко помощ за база данни

Проблема в случая е, че трябва да се гадае. Дори да сте улучили конфигурацията, която WinKam използва, е просто защото mysql e най-често използваното решение, но нямате гаранция, че примерно не ползва SQLite или PostreSQL, или че енкодинга на сайта не е windows-1251, в който случай промяната на енкодинга на таблицата към utf8 не би помогнал много.
 
От: Малко помощ за база данни

Има и още по-дървен вариянт. Записваш го като lv и при показването на резултата проверяваш дали е lv и го плюеш като лв.
 
От: Малко помощ за база данни

От страна на оптимизация, това може да стане с enum (set - в най-кофтия случай), но аз бих го направил с integer - 0 - euro; 1 - лев; 2 - dollar и т.н. Няма нужда всеки път да ти се появява един и същ текст повече от веднъж.
 
От: Малко помощ за база данни

Да, таблицата е Mysql. Системата която ползвам през cpanel e phpMyAdmin. Енкодинга на цялата колона symbol е: utf8-general_ci . Пробвах да сменя няколко пъти енкодинга, но пак не се показа лв. Включително и с cp1251. Сайта е с енкодинг UTF-8. Снощи изтрих всички излишни валути, че бяха доста. Над 50. Оставих само EUR и USD. Добавих нов ред Bulgarian lev със символ BGN. Така го показва, но като го направя лв. не ми излиза на кирилица, а ??. Ще пробвам пак да сменям и да търся. А на мен другите валути не ми трябват и те. Искам да оставя само лв. Ако има начин да изтрия цялата таблица rates и да създам на нейно място нова само с един ред валута лев, само да се показва символа за лев. Таблицата е с 4 колони.
id, ime, valuta, symbol
1 Bulgaria Bulgarian lev BGN

За символ е зададено да са задължително 3 букви. Дали това играе роля за полето че не става лв.?
 
От: Малко помощ за база данни

Зявката, която вероятно ще ти помогне е "SET NAMES utf8", като идеята е да я пускаш веднага след избирането на базата данни.

Понеже не си споменал и на какъв език пишеш, дадените примери са за PHP.
Ако, ползваш mysql extenstion-а, ще е добре да я извикваш веднага след mysql_select_db() - прмерно mysql_query("SET NAMES utf8");
Ако, си с mysqli, си има отделна функция mysqli_set_charset (или обектно ориентирания вариант mysqli::set_charset). Повече за нея, заедно с пример - http://php.net/manual/en/mysqli.set-charset.php
Ако, ползваш PDO или нещо друго ще се оправиш и сам, така или иначе принципа е един и същ.
 
  • Like
Реакции: klk
От: Малко помощ за база данни

Още по-добре е ако пуснеш един дъмп на таблицата тука да видим какво може да се направи. Според мен обаче енкодинга ти не трябва да е UTF8 за тая таблица. Мисля, че е cp1251.
 
От: Малко помощ за база данни

Няма никаква логична причина все още да се ползва cp1251 за каквото и да било, при наличието на utf8
 
От: Малко помощ за база данни

Напълно съм съгласен, че няма логична причина. Но човека може да ползва някаква стара система. Знае ли човек :)
 
От: Малко помощ за база данни

Винаги можеш да добавиш в кода (там където се свързваш с DB):
PHP:
mysql_query( 'set character set utf8' );
или
PHP:
mysql_query( 'set character set cp1251' );

Това, ако ползваш mysql. Ако ползваш PDO, тогава нещо такова примерно:
PHP:
$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh -> exec("set names utf8");
 
Последно редактирано:
От: Малко помощ за база данни

И още един пример:

CREATE TABLE `currency` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ime` varchar(255) NOT NULL,
`valuta` varchar(255) NOT NULL,
`symbol` varchar(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `currency` VALUES ('1', 'Bulgaria', 'Bulgarian lev', 'лв.');


CREATE TABLE `currency` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ime` varchar(255) COLLATE cp1251_bulgarian_ci NOT NULL,
`valuta` varchar(255) COLLATE cp1251_bulgarian_ci NOT NULL,
`symbol` varchar(5) COLLATE cp1251_bulgarian_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251 COLLATE=cp1251_bulgarian_ci;

INSERT INTO `currency` VALUES ('1', 'Bulgaria', 'Bulgarian lev', 'лв.');

Нещо такова :)
 
От: Малко помощ за база данни

Още немога да се справя с проблема. Определено не е в базата данни а някъде в php файловете където се извиква. Много е объркана системата и немога да го намеря. Ето кода на currency.php в админ панела където се задава валутата.
Код:
define('InAdmin', 1);
$current_page = 'settings';
include '../common.php';
include $include_path . 'functions_admin.php';
include 'loggedin.inc.php';

unset($ERR);
$html = '';

// Create currencies array

$query = "SELECT id, valuta, symbol, ime FROM " . $DBPrefix . "rates ORDER BY ime";
$res_ = mysql_query($query);
$system->check_mysql($res_, $query, __LINE__, __FILE__);
if (mysql_num_rows($res_) > 0)
{
	while ($row = mysql_fetch_array($res_))
	{
		$CURRENCIES[$row['id']] = $row['symbol'] . ' ' . $row['ime'] . ' (' . $row['valuta'] . ')';
		$CURRENCIES_SYMBOLS[$row['id']] = $row['symbol'];
	}
}

if (isset($_POST['action']) && $_POST['action'] == 'update')
{
	// Data check
	if (empty($_POST['currency']))
	{
		$ERR = $ERR_047;
	}
	elseif (!empty($_POST['moneydecimals']) && !is_numeric($_POST['moneydecimals']))
	{
		$ERR = $ERR_051;
	}
	else
	{
		// Update database
		$query = "UPDATE " . $DBPrefix . "settings SET
				currency = '" . $system->cleanvars($CURRENCIES_SYMBOLS[$_POST['currency']]) . "',
				moneyformat = " . intval($_POST['moneyformat']) . ",
				moneydecimals = " . intval($_POST['moneydecimals']) . ",
				moneysymbol = " . intval($_POST['moneysymbol']);
		$system->check_mysql(mysql_query($query), $query, __LINE__, __FILE__);
		$system->SETTINGS['currency'] = $CURRENCIES_SYMBOLS[$_POST['currency']];
		$system->SETTINGS['moneyformat'] = $_POST['moneyformat'];
		$system->SETTINGS['moneydecimals'] = $_POST['moneydecimals'];
		$system->SETTINGS['moneysymbol'] = $_POST['moneysymbol'];
		$ERR = $MSG['553'];
	}
}

$link = "javascript:window_open('" . $system->SETTINGS['siteurl'] . "converter.php','incre',650,250,30,30)";

foreach ($CURRENCIES_SYMBOLS as $k => $v)
{
	if ($v == $system->SETTINGS['currency'])
		$selectsetting = $k;
}

loadblock($MSG['5008'], '', generateSelect('currency', $CURRENCIES));
loadblock('', $MSG['5138'], 'link', 'currenciesconverter', '', array($MSG['5010']));
loadblock($MSG['544'], '', 'batchstacked', 'moneyformat', $system->SETTINGS['moneyformat'], array($MSG['545'], $MSG['546']));
loadblock($MSG['548'], $MSG['547'], 'decimals', 'moneydecimals', $system->SETTINGS['moneydecimals']);
loadblock($MSG['549'], '', 'batchstacked', 'moneysymbol', $system->SETTINGS['moneysymbol'], array($MSG['550'], $MSG['551']));

$template->assign_vars(array(
		'ERROR' => (isset($ERR)) ? $ERR : '',
		'SITEURL' => $system->SETTINGS['siteurl'],
		'LINKURL' => $link,
		'OPTIONHTML' => $html,
		'TYPENAME' => $MSG['25_0008'],
		'PAGENAME' => $MSG['5004']
		));

$template->set_filenames(array(
		'body' => 'adminpages.tpl'
		));
$template->display('body');

Сложил съм mysql_query("SET NAMES utf8"); във файла functions_global.php. Пак се показват ??. Трябва ли и тук да слагам нещо за да разбере енкодинга? В базата дани съм изтрил другите две валути и оставих само един ред: Български лев. А аз си мисля: - Да еба мама му щом ми трябва само един запис, защо ми е таблица. Може ли да се направи вариант тук, ако я няма таблицата rates, да зададе символ за валутата: лв. Да ги опростя нещата. Само с една валута без извикване на таблица. Както виждате във файла даже има код за javascript конвертор на валута на Google. Който така или иначе не работи. Ще го махна и него.
 
От: Малко помощ за база данни

Пробвай да сложиш непосредствено под:
// Create currencies array
Следното
mysql_query( 'set character set utf8' );
или
mysql_query( 'set character set cp1251' );

Първо пробваш с едното, после с другото. Не знам каква ти е колацията на полетата. можеш да го сложиш и на конкретно поле, но дай да видим така.
 
Последно редактирано:
От: Малко помощ за база данни

Какъв ти е енкодинга на самия PHP файл?
Виж през редактора, който ползваш дали има опция да се смени на UTF-8 without BOM, ако в момента е на нещо различно (примерно ANSI).
Ако, текущия ти редактор няма подобни възможности, пробвай през друг.
 

Горе