Какое сопоставление лучше всего использовать для MySQL с PHP? [закрыто]

Что для меня работало, так это создать модель представления, содержащую свойство date в виде строки. Присвоение свойства DateTime из модели домена и вызов .ToString () в свойстве date при назначении значения в viewmodel.

Результат JSON из метода действия MVC возвращает дату в формате, совместимом с представлением.

Просмотреть модель

public class TransactionsViewModel
{
    public string DateInitiated { get; set; }
    public string DateCompleted { get; set; }
}

Модель домена

public class Transaction{
   public DateTime? DateInitiated {get; set;}
   public DateTime? DateCompleted {get; set;}
}

Метод действия контроллера

public JsonResult GetTransactions(){

var transactions = _transactionsRepository.All;
        var model = new List<TransactionsViewModel>();

        foreach (var transaction in transactions)
        {
            var item = new TransactionsViewModel
            {
                ...............
                DateInitiated = transaction.DateInitiated.ToString(),
                DateCompleted = transaction.DateCompleted.ToString(),
            };

            model.Add(item);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
}
696
задан Darryl Hein 23 February 2016 в 03:50
поделиться

5 ответов

Основное различие сортирует точность (при сравнении символов на языке) и производительность. Единственный специальный является utf8_bin, который является для сравнения символов в двоичном формате.

utf8_general_ci несколько быстрее, чем utf8_unicode_ci, но менее точен (для сортировки). определенный язык utf8 кодирование (такой как utf8_swedish_ci) содержит дополнительные правила языка, которые делают их больше всего с точностью до вида для тех языков. Большую часть времени я использую utf8_unicode_ci (я предпочитаю точность маленьким повышениям производительности), если у меня нет серьезного основания предпочесть определенный язык.

можно читать больше на определенных unicode наборах символов на руководстве MySQL - http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

586
ответ дан Overflowh 23 February 2016 в 03:50
поделиться

На самом деле Вы, вероятно, хотите использовать utf8_unicode_ci или utf8_general_ci.

  • utf8_general_ci виды путем снимания всех диакритических знаков и сортировки, как будто это был ASCII
  • utf8_unicode_ci, используют порядок сортировки Unicode, таким образом, это сортирует правильно на большем количестве языков

Однако, если Вы только используете это для хранения английского текста, они не должны отличаться.

112
ответ дан SiHa 23 February 2016 в 03:50
поделиться

Для текстовой информации UTF-8 необходимо использовать utf8_general_ci потому что...

  • utf8_bin: сравните строки двоичным значением каждого символа в строке

  • utf8_general_ci: сравните строки с помощью общих правил языка и с помощью нечувствительных к регистру сравнений

иначе это, желание должно, делая поиск и индексацию данных быстрее/больше эффективными/больше полезный.

12
ответ дан mepcotterell 23 February 2016 в 03:50
поделиться

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

Пример от документация :

utf8_general_ci также является удовлетворительным и для немецкого и для французского языка, за исключением того, что ‘ß’ равен ‘s’, а не ‘ss’. Если это приемлемо для Вашего приложения, то необходимо использовать utf8_general_ci, потому что это быстрее. Иначе используйте utf8_unicode_ci, потому что это более точно.

Так - это зависит от Вашей ожидаемой базы пользователей и от того, в каком количестве Вы нуждаетесь корректный сортировка. Для английской базы пользователей, utf8_general_ci должен быть достаточным, для других языков, как шведские, специальные сопоставления были созданы.

43
ответ дан Tomalak 23 February 2016 в 03:50
поделиться

Помните об этой проблеме, которая может возникнуть при использовании utf8_general_ci .

MySQL не будет различать некоторые символы в операторах выбора, если используется сопоставление utf8_general_ci . Это может привести к очень неприятным ошибкам - особенно, например, когда задействованы имена пользователей. В зависимости от реализации, в которой используются таблицы базы данных, эта проблема может позволить злоумышленникам создать имя пользователя, соответствующее учетной записи администратора.

Эта проблема проявляется, по крайней мере, в ранних версиях 5.x - я не уверен, изменилось ли это поведение позже.

Я не администратор баз данных, но, чтобы избежать этой проблемы, я всегда использую utf8-bin вместо регистра без учета регистра.

Приведенный ниже сценарий описывает проблему на примере.

-- first, create a sandbox to play in
CREATE DATABASE `sandbox`;
use `sandbox`;

-- next, make sure that your client connection is of the same 
-- character/collate type as the one we're going to test next:
charset utf8 collate utf8_general_ci

-- now, create the table and fill it with values
CREATE TABLE `test` (`key` VARCHAR(16), `value` VARCHAR(16) )
    CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `test` VALUES ('Key ONE', 'value'), ('Key TWO', 'valúe');

-- (verify)
SELECT * FROM `test`;

-- now, expose the problem/bug:
SELECT * FROM test WHERE `value` = 'value';

--
-- Note that we get BOTH keys here! MySQLs UTF8 collates that are 
-- case insensitive (ending with _ci) do not distinguish between 
-- both values!
--
-- collate 'utf8_bin' doesn't have this problem, as I'll show next:
--

-- first, reset the client connection charset/collate type
charset utf8 collate utf8_bin

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Note that we get just one key now, as you'd expect.
--
-- This problem appears to be specific to utf8. Next, I'll try to 
-- do the same with the 'latin1' charset:
--

-- first, reset the client connection charset/collate type
charset latin1 collate latin1_general_ci

-- next, convert the values that we've previously inserted
-- in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET latin1 COLLATE latin1_general_ci;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Again, only one key is returned (expected). This shows 
-- that the problem with utf8/utf8_generic_ci isn't present 
-- in latin1/latin1_general_ci
--
-- To complete the example, I'll check with the binary collate
-- of latin1 as well:

-- first, reset the client connection charset/collate type
charset latin1 collate latin1_bin

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Again, only one key is returned (expected).
--
-- Finally, I'll re-introduce the problem in the exact same 
-- way (for any sceptics out there):

-- first, reset the client connection charset/collate type
charset utf8 collate utf8_generic_ci

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

-- now, re-check for the problem/bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Two keys.
--

DROP DATABASE sandbox;
117
ответ дан 22 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: