Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: MySQL,PHP - странности при превышении лмимта CHAR()
 
 автор: dim0s   (09.03.2007 в 01:46)   письмо автору
 
 

Здравствуйте.
такая вот проблема. В базе три таблицы для разных языков.

В каждой присутствует поле

prgr_title CHAR(48);

Все работет нормально, если лимт в 48 символов не превышется.
Если -же вводиться больше, чем 48 начинаются непонятки.

С Английским все работает как и должно, а вот русский ...
Вместо 48 при выводе оказывается сколько угодно. Может 30, там или 37, да еще вдобавок при выводе в конце строки какие-то символы непечатные вылазят и весь вывод гробят вообще.
Получается вроде что англ. символы записываются в базу нормально, а русские(те которых нет в англ. алфавите в виде
б
. Ну это я так думаю...
И как сэтим бороться?

   
 
 автор: Trianon   (09.03.2007 в 09:11)   письмо автору
 
   для: dim0s   (09.03.2007 в 01:46)
 

Сперва поглядите, в каком виде они попадают в скрипт?

   
 
 автор: dim0s   (09.03.2007 в 11:41)   письмо автору
 
   для: Trianon   (09.03.2007 в 09:11)
 

В базу пишуться из формы со страницы в кодировке utf-8.
Пробовал обрезать средствами PHP перед вводом в базу. Ну и бестолку. PHP обрезает нормально 48 РУССКИХ символов, а при передаче в базу что-то происходит и строка преобразуется в эти блин последовательности.
корова
Передается методом POST. База обрезает уже 48 символов из этой строки с последовательностями и все...
На выводе потом точки с запятой все гробят естественно.

   
 
 автор: Trianon   (09.03.2007 в 12:05)   письмо автору
 
   для: dim0s   (09.03.2007 в 11:41)
 

показывайте, как формируете запрос.
От исходного значения в $_POST до mysql_query()

   
 
 автор: dim0s   (09.03.2007 в 12:31)   письмо автору
 
   для: Trianon   (09.03.2007 в 12:05)
 

Вот фрагменты кода, должно вроде быть понятно, что- к чему.


<?php
function deep_replase($str)
  {
  
$str trim ($str);
  
$str str_replace("\r\n","[br]",$str);
  
$str str_replace("\n","[br]",$str);
  
$str str_replace("\r","",$str);
  if (!
get_magic_quotes_gpc()) 
  { 
  
$str mysql_escape_string($str);
  }
  return 
$str;
  }
// тут приходят из формы данные
if (!isset($_GET['prgr_id'])) {$prgr_id=null;} else {$prgr_id $_GET['prgr_id'];}
if (isset(
$_POST['prgr_title'])){$prgr_title deep_replase($_POST['prgr_title']);} else {$prgr_title="";}
if (isset(
$_POST['prgr_text'])){$prgr_text rte_deep_replase($_POST['prgr_text']);} else {$prgr_text="";}

$query "update $prgr_table set prgr_title = '$prgr_title', prgr_text = '$prgr_text'   where prgr_id = '$prgr_id' ";
$result mysql_query($query);
// ну и дальше...
?>

   
 
 автор: Trianon   (09.03.2007 в 12:53)   письмо автору
 
   для: dim0s   (09.03.2007 в 12:31)
 

Чудеса в решете....

Если сделать вывод echo htmlspecialchars($query);
что получается?

В принципе, здесь больше напрашивается mysql_real_escape_string() -поскольку кодировка многобайтовая... Но дело явно не в этом...

А набор символов страницы в типе документа точно прописан?

   
 
 автор: dim0s   (09.03.2007 в 14:46)   письмо автору
 
   для: Trianon   (09.03.2007 в 12:53)
 

Типа в мета-теге? да - utf-8.
Я наверно не точно описал. Вернее выдал свои домыслы за действительность. Похоже нет там никаких этих последовательностей.
Факт в том, что русскую строку в базе обрезает короче заданного лимита
prgr_title CHAR(48); 
,
Опять неточно. Короче если, то что остается от русской строки перекодировать из utf-8 в ANSI, то как раз получается 48 символов. Вообщем выходит что в базе оно в ANSI кодировке чтоли оказывается непонятно почему.?
А при выводе само-сабой перекодируется в utf-8, яж ничего не прописывал по этому поводу.
Вообщем я окончательно запутался с этими кодировками.

   
 
 автор: Trianon   (09.03.2007 в 15:47)   письмо автору
 
   для: dim0s   (09.03.2007 в 14:46)
 

utf-8 - кодировка, в которой разные символы занимают разное число байт.
Если у Вас русский текст хранится - смело множьте размер столбца на два, перед тем как этот столбец в таблице создавать.

   
 
 автор: dim0s   (09.03.2007 в 16:23)   письмо автору
 
   для: Trianon   (09.03.2007 в 15:47)
 

Ну я вообщем так и сделал, вааще все в text переделал. Потому как это типа админки, а пользователю не прикажешь. Они любят нажать на клавишу и сделать длинную - длинную строчечку из какого нибудь символа красивенького.
А вывод ,если превысить, сносит напрочь. В конце строки появляется какой-то символ, нечитаемый не в одной кодировке, и все рушит напрочь.
Но только все это непавильно как-то. Мне в данном случае до фонаря, база маленькая, запросов мало, а если что-то серьезное мутить, все текстовые данные в виде text засовывать?
Спасибо за поддержку.

   
 
 автор: dim0s   (13.03.2007 в 19:16)   письмо автору
 
   для: dim0s   (09.03.2007 в 16:23)
 

Раобрался я.
Вообщем при создании таблицы добавил CHARACTER SET utf8 TYPE=myisam . И все заработало.
Хотя там по умолчанию utf8, тaблицы isam - почему-то.
Может все это было из-за другого типа таблиц? Но вообщем сейчас все работает правильно с текстом на любом языке.

   
 
 автор: Trianon   (14.03.2007 в 10:08)   письмо автору
 
   для: dim0s   (13.03.2007 в 19:16)
 

что-то у Вас при установке глюкануло... Обычно isam не ставится умалчиваемым типом таблиц.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования