![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
SELECT t.`link` FROM (SELECT CONCAT('/новости/региональные/', 1, '.html') AS link) AS t;
SELECT CONCAT('/новости/региональные/', 1, '.html') AS link;
Не смотря на видимую схожесть запросов, первый возвращает строку переконвертированную в юникод, причем часть строки теряется, в второй все выводит нормально русскими буквами. Если же 1 написать как строку, проблемы нет, точно так же само как и при использовании латиницы.
Кто подскажет почему?
Неактивен
После некоторого времени, проведенного с документацией, часть проблемы стала понятной. В concat число конвертируется в его бинальное представление. Оставшийся вопрос - почему с латиницей не возникает проблем?
Неактивен

Ай, какая красота! ![]()
Для начала — чем эти случаи отличаются. Подзапрос рассматривается MySQL
просто как таблица, из которой можно вытаскивать данные. У таблицы всегда
должна быть фиксированная структура столбцов.
Структуру столбцов можно попробовать угадать вот так:
[silentia] root test > CREATE TABLE x SELECT CONCAT('ы', 1);
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 1
[silentia] root test > CREATE TABLE xx SELECT CONCAT('ы', '1');
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
[silentia] root test > SHOW CREATE TABLE x\G
*************************** 1. row ***************************
Table: x
Create Table: CREATE TABLE `x` (
`CONCAT('ы', 1)` varbinary(2) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
[silentia] root test > SHOW CREATE TABLE xx\G
*************************** 1. row ***************************
Table: xx
Create Table: CREATE TABLE `xx` (
`CONCAT('ы', '1')` varchar(2) CHARACTER SET utf8 NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)Тут мы видим, что (ровно так, как написано в документации) тип CONCAT
двух строк — строка, а CONCAT строки и числа — двоичная последователь-
ность. Единственная ошибка MySQL, которую я тут вижу, — это то, что при
создании последовательности он использует CHAR_LENGTH(), а не LENGTH()
при подсчете длины строки. То, что оказывается правильным для строки,
не является правильным для двоичной последовательности ![]()
http://bugs.mysql.com/bug.php?id=45780 — та же ошибка, но чуть другие данные.
Неактивен