Смешивание полей UTF8 и latin1_bin в MySQL с PHP - PullRequest
3 голосов
/ 26 октября 2011

В базе данных мне придется хранить имена и тому подобное в UTF8, а хэши в latin1_bin.Я позвонил SET NAMES utf8, но заметил, что это повредило поля latin1, когда я попытался их прочитать (я смог написать их очень хорошо).Что странно, поскольку, если я правильно понял, этот запрос только о отправке данных на сервер, а не получении этого.

phpMyAdmin также отображает поврежденные данные.*

Любая подсказка о том, что я могу делать неправильно?

(используя MAMP 1.9.6)

edit: этот ответ указывает, что это также используемая кодировкаотправить данные обратно клиенту.Я запутался: какой смысл указывать кодировку столбца, если он все равно будет проигнорирован?

edit: отрывок из определения столбца:

  `tok` char(64) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `sal` char(16) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
...
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_roman_ci ;

отрывок из запросов:

SELECT tok,sal FROM user WHERE id=4 LIMIT 1

.

INSERT INTO user (tok, sal) VALUES (x'1387ea0c22277d3000bd23241c357e3a9ba45a2e28f50581d63a73bf785a7458a95cca4de27d0a86588f5bdfa94415d6a255c2c0379ebc2f00dacba03ae6b866', x'8fca28a592c29f245ff0a3ba5f97420c')

Ответы [ 3 ]

4 голосов
/ 28 октября 2011

Вам следует изменить определение таблицы, чтобы использовать тип MySql BINARY, который идеально подходит для данных такого типа:

Типы BINARY и VARBINARY похожиCHAR и VARCHAR, за исключением того, что они содержат двоичные строки, а не недвоичные строки.То есть они содержат строки байтов, а не строки символов.Это означает, что у них нет набора символов, а сортировка и сравнение основаны на числовых значениях байтов в значениях.

Определения столбцов станут следующими:

`tok` binary(64) NOT NULL,
`sal` binary(16) NOT NULL,
0 голосов
/ 26 октября 2011

Оставив SET NAMES включенным, и запрос INSERT без изменений, я изменил запрос SELECT на:

SELECT BINARY(tok) AS tok, BINARY(sal) AS sal FROM user WHERE id=4 LIMIT 1

т.е. Я преобразовал поля хеша в двоичный файл.

Хотя это сработало, я оставлю это открытым, если кто-то предоставит (возможно, более правильную?) Альтернативу.

0 голосов
/ 26 октября 2011

set names ... устанавливает только набор символов соединения (только на стороне клиента!) Для отправки и получения данных. Это не связано с кодировкой полей в базе данных! Это относится только к кодировке, которую вы используете в качестве клиента для базы данных, например в PHP. Механизм базы данных всегда преобразует кодировку между кодировкой в ​​таблицах в кодировку, указанную в запросе set names ....

Таким образом, в определении таблицы вы просто указываете кодировку для каждого поля, как вам нужно, и вы ничего не меняете способом, которым вы использовали команду set names ... - она ​​просто остается такой же, как и раньше.

...