2013-12-02 3 views
1

Я использую криптографическую функцию в PHP (mcrypt_create_iv). Я видел, что в моей таблице базы данных поле, в котором хранится это возвращаемое значение функции, имеет кодировку latin1_swedish_ci, тогда как в CodeIgniter (config/database.php) для кодировки установлено значение utf8.Имея разные серверные и базовые кодировки - CodeIgniter

Я тестировал сохранение кодировки как utf8 в CI и запускаю метод, который хранит зашифрованные данные в столбце таблиц, но он возвратил кучу вопросительных знаков и прочее, что не заставило меня чувствовать уверенность в том, что функция mcrypt работала ,

Поэтому я изменил код базы данных CIs на latin1, что совпадает с полем в моей таблице баз данных. Мой конфигурационный файл DB теперь выглядит следующим образом:

$db['default']['char_set'] = 'latin1'; 
$db['default']['dbcollat'] = 'utf8_general_ci'; 

мне было интересно, если бы какие-либо проблемы, вызванные использованием как latin1 и utf8? Я чувствую, что он просто выглядит не так, используя два разных кодировки и все, но для того, чтобы использовать функцию mcrypt_create_iv (которая используется для соляных паролей, большое дело imo), я прибегал к тому, чтобы делать это в любом случае, надеясь, что это не повлияет ни на что (т.е. вставка/получение данных обратно правильно).

Может кто-то пролить некоторый свет, я был бы очень признателен. Спасибо

+0

То, что вы видите контрольные вопросы в базе данных, не означает, что данные неверны в базе данных, поскольку данные отображаются как латинские, но это utf8 (например). Однако всегда лучше использовать одну и ту же кодировку в вашем приложении, базе данных и подключении. – Haneev

+0

@Haneev Знаки вопроса появляются, когда у меня есть кодировка как utf8. Я бы не стал использовать latin1, если бы я не видел столько вопросительных знаков в шифровании. Но вы говорите, что если я буду хранить все до utf8, функция mcrypt все равно сможет расшифровать правильный пароль? – a7omiton

ответ

1

Использование charset latin, но сортировка UTF не имеет большого смысла. Кодировка latin превратит большинство символов Юникода в «?» поскольку они не существуют в указанной кодировке. Использование сопоставления на основе символов, которые не входят в выбранную вами кодировку, ничего не сделает.

Итак: если вы хотите иметь возможность хранить все текстовые данные, вы хотите изменить свою кодировку utf8 и использовать настройку utf8_general_ci. Если вы просто хотите только latin1 (я не знаю, почему вы бы это сделали, но вы могли бы ...), то также используйте правила сортировки для латинского языка.

Если вы сделать идти с utf8, вы также хотите, чтобы не забыть, когда вы устанавливаете соединение с базой данных, убедитесь, что соединение также использует utf8 для его charset и names, так что вы не потерять текст «на транспорте» между вашим сервером и вашей базой данных.

+0

Спасибо за ответ. Я думал, что CI уже проверил соединение использует utf8 по настройке конфигурации, о которой я упоминал? Но разве было бы бессмысленно проверять, использует ли соединение также utf8, когда я знаю, что поля в моей базе данных используют latin1_swedish_ci (по умолчанию)? – a7omiton

+1

чувствую себя свободно, чтобы дважды проверить это, но я бы предпочел убедиться, что это utf8 от начала до конца, а не доверять CI и обнаружить его не после того, как данные начали перемещаться –

Смежные вопросы