Ничего не понимаю с кодировками!!!
Модератор: Модераторы
Лимит строки в DB сделай такой UTF8Length(str)+1
Дело не в нехватки поля базы!!!! Поле базы 512, тогда как в неё пишется строка из 128 русских символов которая уж 100% короче заложенных 512. Проблема в чём то другом.
Для ввода строки использую обычный Edit, в нём выставляю параметр MaxLength:=128, это может как то сказаться?
Для ввода строки использую обычный Edit, в нём выставляю параметр MaxLength:=128, это может как то сказаться?
Дело в том, что русские символы могут занимать 2 или 4 байта. Если, скажем, выделено поле на 40 байт, то это не значит, что влезет максимум 10 символов, а может от 10 до 20. Теперь представим ситуацию, что набрано 15 символов и ими занято 38 байт. 16-й символ 4-х байтный. Следовательно в showmessage корректно отобразятся 16 символов, а поле в таблице примет от 16-ого символа только первые 2-байта вместо 4-х. Вот Вам и кракозябра вместо нормального символа.
VirtUX
Русские (Кириллица) символы занимают именно 2 байта! Диапазон в Unicode с 0x04001 по 0x04E9. Соответственно в UTF-8 будут иметь вид %110xxxxx %10xxxxxx
Русские (Кириллица) символы занимают именно 2 байта! Диапазон в Unicode с 0x04001 по 0x04E9. Соответственно в UTF-8 будут иметь вид %110xxxxx %10xxxxxx
Ребята... стойте... я вижу между нами повисло непонимани.
В 2 последних постах изложена информация которую я освоил и в которой разобрался... ещё раз попробую объяснить проблему:
Программа во время своей работы вносит в таблицу строковые данные, длина которых ограничена ПРОГРАММНО а не полями таблиц, поля же таблиц заданы согласно расчёта 4 байта на символ (максимум программно лимита * 4), таким образом ситуация "буквы не влезли" исключена категорически, пространство касательно русских символов избыточно!!!!
Таким образом я прошу помочь с ситуцией изложенной на моём посте со скрином И ЭТО ТОЧНО НЕ НЕХВАТКА МЕСТА В ПОЛЕ БАЗЫ!!!!
В 2 последних постах изложена информация которую я освоил и в которой разобрался... ещё раз попробую объяснить проблему:
Программа во время своей работы вносит в таблицу строковые данные, длина которых ограничена ПРОГРАММНО а не полями таблиц, поля же таблиц заданы согласно расчёта 4 байта на символ (максимум программно лимита * 4), таким образом ситуация "буквы не влезли" исключена категорически, пространство касательно русских символов избыточно!!!!
Таким образом я прошу помочь с ситуцией изложенной на моём посте со скрином И ЭТО ТОЧНО НЕ НЕХВАТКА МЕСТА В ПОЛЕ БАЗЫ!!!!
Посмотри реальный размер строки Length(str) и сравни его с размером поля данных - узнаешь нехватка места или нет 
Ну я ведь специально расписал что вводимые строки ограничиваются ПРОГРАММОЙ, программа не допускает запись более 128 символов в поле показанное на скреншоте, тогда как заложено 512 байт!!!!
результат ровно 256!!!! Крякозябрик наместе!
Код: Выделить всё
showmessage(inttostr(Length(srs.E1.Text)));результат ровно 256!!!! Крякозябрик наместе!
Последний раз редактировалось qivi 03.11.2009 18:37:09, всего редактировалось 1 раз.
- Attid
- долгожитель
- Сообщения: 2589
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
qivi писал(а):программа не допускает запись более 128
как проверяешь длину ?
Добавлено спустя 1 минуту 12 секунд:
посмотри какой байт в этом кракозяке и в какой момент он там появляется
Для ввода этих самых строковых данных я использую обычный Edit, а ему задаю параетр:
Таким образом вводимые строки ограничиваются 128 символами.
Появляется он там после:
А вот как посмотреть что это за байт я не придумал... но когда я два раза щёлкаю на строку в дбгриде и он её выделяет (на редактирование), этот символ в конце исчезает (неотображается), а когда я снимаю выделение со строки ничего не меняя он опять там.
Код: Выделить всё
srs.E1.MaxLength:=128;Таким образом вводимые строки ограничиваются 128 символами.
посмотри какой байт в этом кракозяке и в какой момент он там появляется
Появляется он там после:
Код: Выделить всё
FieldByName('nazvanie').AsString:=srs.E1.Text;А вот как посмотреть что это за байт я не придумал... но когда я два раза щёлкаю на строку в дбгриде и он её выделяет (на редактирование), этот символ в конце исчезает (неотображается), а когда я снимаю выделение со строки ничего не меняя он опять там.
qivi писал(а):Как поправить то косяк?
1111.png
конкретно в данном случае задавать максимальное четное количество
конкретно в данном случае задавать максимальное четное количество
В смысле чётное количество символов? Дак и так заданный лимит 128 символов...
Добавлено спустя 13 часов 43 минуты 26 секунд:
ЭВРИКА!!!! Понял что это за крякозябрик!!!!
результат ровно 256!!!! Крякозябрик наместе!
А поле TDBF типа String вмещает только 255 байт!!!!
Отсюдова новая и куда более серьёзна проблема... как быть с полем 1200 символов (4800 байт)? Какой тип полей TDBF поддерживает большие строки?
qivi писал(а):А поле TDBF типа String вмещает только 255 байт!!!!
254.
Для мемо-полей теоретически ограничения нет. На практике же надо проверять.
Меммо относится к данным не фиксированной длины, под него формируется отдельный файл, что честно говоря не желательно , а типа длинных определённой длины для строковых переменных большого размера в TDBF нету?
qivi писал(а):а типа длинных определённой длины для строковых переменных большого размера в TDBF нету?
TDBF тут совершенно не при чём. Проблема в самом формате файла. TDBF лишь ориентируется на существующий формат, от себя она ничего не добавляет.
