В MySQL има определени функции за дата, които връщат име на ден или месец. По-специално, имам предвид DATE_FORMAT()
, DAYNAME()
и MONTHNAME()
функции. Те може да връщат стойност, да речем, ноември , или понеделник , в зависимост от използваната заявка. Но резултатите могат също толкова лесно да бъдат върнати на различен език, ако е необходимо.
Езикът, който тези функции използват за връщаната си стойност, се извлича от lc_time_names
системна променлива. Можете да видите стойността на тази променлива или да зададете нейната SESSION
стойност, така че резултатите от тези функции да са на желания език/локал.
Имената на локали имат езикови и регионални подтагове, изброени от Internet Assigned Numbers Authority (IANA). Примерите включват en_US
за английски – САЩ , en_NZ
за английски – Нова Зеландия , или es_PA
за испански – Панама и т.н. (за списък с локали, поддържани от MySQL, вижте Пълен списък с локали в MySQL).
В тази статия ще ви покажа как да намерите текущия локал за вашата връзка, да го промените и след това да видите как се отразява на резултатите от заявка. Също така ви показвам функция, която е имунизирана срещу тази настройка (но не се притеснявайте, тази функция ви позволява да посочите локала).
Преглед на текущия език
Първо, нека видим каква е текущата стойност на lc_time_names
системна променлива.
ИЗБЕРЕТЕ @@lc_time_names;
Резултат:
+-----------------+| @@lc_time_names |+----------------+| en_US |++-----------------+
Така че моят текущ локал е en_US
. Това всъщност е стойността по подразбиране, независимо от настройката за локал на вашата система (но това може да бъде променено при стартиране на сървъра или чрез задаване на GLOBAL
стойност).
Промяна на локала
Сега нека променим локала и да видим резултата.
ЗАДАДЕТЕ lc_time_names ='de_BE';ИЗБЕРЕТЕ @@lc_time_names;
Резултат:
+-----------------+| @@lc_time_names |+----------------+| de_BE |++-----------------+
В този случай промених локала на de_BE
, което е за немски – Белгия .
Пример за употреба
Ето пример, в който задавам локала, след което изпълнявам заявка, която връща име на месец. След това задавам локала на различна стойност, след което изпълнявам отново същата заявка.
1-ви език:английски – Съединени щати
ЗАДАДЕТЕ lc_time_names ='en_US';ИЗБЕРЕТЕ MONTHNAME('1999-10-03');
Резултат:
+------------------------+| MONTHNAME('1999-10-03') |+-------------------------+| октомври |+------------------------+
2-ри език:испански – Испания
ЗАДАДЕТЕ lc_time_names ='es_ES';ИЗБЕРЕТЕ MONTHNAME('1999-10-03');
Резултат:
+------------------------+| MONTHNAME('1999-10-03') |+-------------------------+| октомври |+-------------------------+
Функцията FORMAT()
Стойността на lc_time_names
не засяга FORMAT()
функция, но тази функция приема трети аргумент, който ви позволява да посочите локала. Ето пример за това, което имам предвид.
ЗАДАДЕТЕ lc_time_names ='de_DE';ИЗБЕРЕТЕ ФОРМАТ(1234, 0), ФОРМАТ(1234, 0, 'de_DE');
Резултат:
+-----------------+-----------------------------------+| ФОРМАТ (1234, 0) | FORMAT(1234, 0, 'de_DE') |+-----------------+------------------- ------+| 1,234 | 1,234 |+------------------+-----------------------------------+предварително>Така че, въпреки че зададох
lc_time_names
доde_DE
първо, първоначалното извикване наFORMAT()
игнорира това. Когато извиках функцията за втори път, изрично посочих същия език/локал като третия аргумент и тя работи.