Вверх ↑
Ответов: 1926
Рейтинг: 172
#1: 2019-10-31 01:22:19 ЛС | профиль | цитата
Мини-ликбез:
До версии 4.1 кодировку можно было задать только для всего сервера, а начиная с версии 4.1 разработчики добавили возможность определения кодировки на разных уровнях иерархии СУБД (для всего сервера, БД, таблиц, столбцов).

CHARACTER SET — кодировка (utf8, cp1251...).

COLLATION — способ упорядочивать и сравнивать данные в БД.
cp1251_general_ci — регистронезависимое сравнение (А = а)
cp1251_bin — регистрозависимое сравнение (просто по номерам байт)
cp1251_general_cs — регистрозависимое (учитывает совп. символы - е/ё, ставит на место символы, к-е в кодировке не по порядку - ё)


Задание при создании:
Для БД: CREATE DATABASE dbname DEFAULT CHARSET cp1251 COLLATE cp1251_bin
Для таблиц: TABLE tblname ( col INT ) DEFAULT CHARSET cp1251 COLLATE cp1251_bin
Для столбцов: col1 char(255), col2 char(255) CHARSET cp1251 COLLATE cp1251_general_ci
Узнать кодировку: SHOW CREATE TABLE tblname.


Задание в программе после подключения к серверу:
SET character_set_client='cp1251' - в какой кодировке поступают данные от программы
SET character_set_connection='cp1251' - как перекодировать данные от программы до выполнения запроса
SET character_set_results='cp1251' - как перекодировать результат
SET collation_connection='cp1251_general_ci' - как сравнивать строки в запросах
Первые три оператора можно заменить SET NAMES 'cp1251'.


Например, у меня БД в utf-8, но в программе используется cp1251. Соотв., используем такой блок:

Add(MultiElementEx,1639716,161,98)
{
@Hint=#9:Кодировки|
}
BEGIN_SDK
Add(EditMultiEx,12685777,21,21)
{
WorkCount=#6:doExec|
EventCount=#6:onExec|
link(doExec,16337394:doExec,[(56,27)(56,76)])
}
Add(DSC_Exec,16337394,91,70)
{
@Hint=#47:в какой кодировке поступают данные от программы|
SQL="SET character_set_client='cp1251'"
DSManager="parent.parent.123"
link(onExec,4275828:doExec,[])
}
Add(DSC_Exec,4275828,140,70)
{
@Hint=#59:преобразовать данные от программы перед выполнением запроса|
SQL="SET character_set_connection='utf8'"
DSManager="parent.parent.123"
link(onExec,2492556:doExec,[])
}
Add(DSC_Exec,2492556,189,70)
{
@Hint=#42:в какую кодировку перекодировать результат|
SQL="SET character_set_results='cp1251'"
DSManager="parent.parent.123"
link(onExec,12685777:onExec,[(271,76)(271,27)])
}
END_SDK
Как приятно, когда появляются вопросы, которыми сам только что занимался и знаешь ответ.
карма: 9
1
Голосовали:powerbatman