powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / COLLATION is not valid for CHARACTER SET
4 сообщений из 4, страница 1 из 1
COLLATION is not valid for CHARACTER SET
    #36030234
drwhite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

MySQL 5.1.35 community on windows XP SP2

Переменные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
character_set_client	utf8
character_set_connection	utf8
character_set_database	utf8
character_set_filesystem	binary
character_set_results	utf8
character_set_server	utf8
character_set_system	utf8

collation_connection	utf8_unicode_ci
collation_database	utf8_general_ci
collation_server	utf8_general_ci



Теперь создаем такую таблицу:
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE `test` 
(
	`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
	`cp1251_text` VARCHAR(  1024  ) CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL ,
	`utf8_text` VARCHAR(  1024  ) NOT NULL 
) ENGINE = MYISAM

//SQL-запрос был успешно выполнен и занял 0.0633 сек.


То есть по идее столбец `cp1251_text` имеет соответствующую кодировку.


Полночи шарюсь по sql.ru, читатю книги, но до конца сообразить пока так и не могу почему
Код: plaintext
SELECT * FROM `test` WHERE `cp1251_text` = '' collate cp1251_general_cs

вызывает
Код: plaintext
 1253  - COLLATION 'cp1251_general_cs' is not valid for CHARACTER SET 'utf8'

при чем здесь УТФ-восемь??

PS.
На всю таблицу cp1251 не покатит, нужно именно на столбец.
...
Рейтинг: 0 / 0
COLLATION is not valid for CHARACTER SET
    #36031503
lonely.k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drwhiteпри чем здесь УТФ-восемь??
1) Кто виноват:
drwhiteПеременные:
Код: plaintext
character_set_connection utf8

означает: мануал
What character set should the server translate a statement to after receiving it?

For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8) . collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence.

Итого: запрос перед выполнением в утф8.

Далее: drwhite
Код: plaintext
SELECT * FROM `test` WHERE `cp1251_text` = '' collate cp1251_general_cs
означает, что для строки '' надо использовать коллейшен cp1251_general_cs. Но эта строка в утф8, а для него нет такого коллейшена. Поэтому:

drwhiteвызывает
Код: plaintext
 1253  - COLLATION 'cp1251_general_cs' is not valid for CHARACTER SET 'utf8'

2) Что делать:
а) установить правильно переменные
или
б) установить в запросе коллейшен на соответствующее поле, а не на строку от клиента
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
COLLATION is not valid for CHARACTER SET
    #39384716
lonely.k, здравствуйте.

У меня возникла похожая ошибка:
автор COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'utf8mb4' SQL=SELECT x.*, REPLACE(m.file_url, "/product/","/product/ksjdk/") as file_url, CONCAT(product_name,"\nАртикул № ", product_sku,"\n",material,"\n",dimensions) as prod_desc FROM ( SELECT DISTINCT pru.product_name , p.product_sku , (SELECT virtuemart_media_id FROM #__virtuemart_product_medias WHERE virtuemart_product_id = p.virtuemart_product_id AND ordering = mo.minorder ORDER BY ordering LIMIT 1) as vmm_id , CONCAT("Материал(ы): ", cf.customfield_value) as material , CONCAT("Размеры(ВхШхД), см: " COLLATE utf8_unicode_ci , CASE WHEN IFNULL(product_height,0)>0 THEN CONVERT(product_height, DECIMAL(10,1)) ELSE "-" END , "х" , CASE WHEN IFNULL(product_width,0)>0 THEN CONVERT(product_width, DECIMAL(10,1)) ELSE "-" END , "х" , CASE WHEN IFNULL(product_length,0)>0 THEN CONVERT(product_length, DECIMAL(10,1)) ELSE "-" END ) as dimensions FROM #__virtuemart_products_ru_ru pru JOIN #__virtuemart_products p USING(virtuemart_product_id) JOIN bng347_product_ids ids USING(virtuemart_product_id) JOIN (SELECT virtuemart_product_id, MIN(ordering) as minorder FROM #__virtuemart_product_medias GROUP BY virtuemart_product_id ) mo USING(virtuemart_product_id) LEFT JOIN #__virtuemart_product_customfields cf ON cf.virtuemart_product_id = pru.virtuemart_product_id AND virtuemart_custom_id = 3 WHERE p.published = 1 ORDER BY ids.virtuemart_category_id , pru.product_name )x JOIN #__virtuemart_medias m ON m.virtuemart_media_id = x.vmm_id

Пытаюсь применить Ваш совет. Скажите, пожалуйста, как правильно "установить в запросе коллейшен на соответствующее поле, а не на строку от клиента" и как понять, на какую строку
...
Рейтинг: 0 / 0
COLLATION is not valid for CHARACTER SET
    #39385214
Удалил COLLATE utf8_unicode_ci в запросе и всё заработало
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / COLLATION is not valid for CHARACTER SET
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]