Проблема, вызванная чувствительностью MySQL к регистру

MySQL
Проблема, вызванная чувствительностью MySQL к регистру

будь позитивным человеком

Пишите, исправляйте ошибки, улучшайте себя

У меня рай, ориентированный на программирование, и цветут весенние цветы!

00 MYSQL чувствителен к регистру

Смотрите слова, как они есть, смотрите название, чтобы знать содержание. Вы когда-нибудь сталкивались с тем, что вас ругали из-за того, что MYSQL чувствителен к регистру?

Я уже читал руководство по разработке Java для Alibaba и видел его в протоколе построения таблиц MySql:

[Обязательно] Имя таблицы и имя поля должны использовать строчные буквы или цифры, причем начало числа запрещено, а также запрещено только два символа подчеркивания. Появляется число. Модификация имен полей базы данных требует больших затрат, поскольку предварительный выпуск не может быть выполнен, поэтому необходимо тщательно продумывать имена полей.

Примечание. MySQL нечувствителен к регистру в Windows, но по умолчанию чувствителен к регистру в Linux.. Таким образом, имя базы данных, Имена таблиц и имена полей не могут быть написаны заглавными буквами, чтобы избежать посторонних ответвлений.

Положительный пример: aliyun_admin, rdc_config, level 3_ name Пример счетчика: AliyunAdmin, rdcConfig, уровень3 name

Если вы действительно не сталкивались с подобными проблемами, иногда у вас нет глубокого понимания этих уставов, когда вы читаете их сухо.

01 История размером с настольную букву

Недавно я возился с проектом для развлечения, и в процессе разработки и тестирования на моей собственной машине не было никаких проблем, но после развертывания на сервере Linux я обнаружил, что сообщается об ошибке.Информация журнала, вероятно, следующая:

MySQLSyntaxErrorException: Table 'kytu.tb_sutyHo' doesn't exist

Есть проблема, немного приуныл, локальная разработка хорошая, как сервер развернуть не получится. Есть призраки... но не паникуйте. Глядя на сообщение об ошибке, это очень очевидно, не так ли?tb_sutyHoТаблица не существует!

① Итак, я без проблем открыл nv (navicat) и проверил, есть ли там таблица.tb_sutyho, но h в нижнем регистре;

②Проверьте код и убедитесь, что имя таблицы действительно написано в коде.tb_sutyHo, просто напишите h как заглавную H.

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

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

Я думаю об этом вопросе, почему это сообщение об ошибке не появляется в локальной среде Windows? Он должен ждать, пока я разверну сервер, в чем проблема? (Если вы чувствительны к размеру Mysql, следующий контент можно пропустить....)

Поэтому я использовал поисковую систему, чтобы обнаружить, что чувствительность к регистру имени базы данных и имени таблицы в Mysql контролируется параметрамиlower_case_table_namesконтроль.

Просмотрите следующее в родной среде Windows:

mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | ON    |
| lower_case_table_names | 1     |
+------------------------+-------+

Просмотр на сервере Linux выглядит следующим образом:

mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF    |
| lower_case_table_names | 0     |
+------------------------+-------+

Из вышеприведенных результатов видно, что разница разная, но я не чувствую этих двух параметров и не знаю, что они означают.

Представляемlower_case_table_namesкогда, кстати,lower_case_file_system.

lower_case_file_system

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

lower_case_table_names

Этот параметр является статическим и может принимать значения 0, 1 или 2.

0 -- с учетом регистра. (Unix, Linux по умолчанию)Созданная библиотечная таблица сохраняется на диске как есть. Например, создайте базу данных TeSt; создаст каталог TeSt, создаст таблицу AbCCC... создаст AbCCC.frm как есть. Операторы SQL также анализируются как есть.

1 -- без учета регистра. (по умолчанию для Windows)При создании библиотечной таблицы MySQL преобразует все имена библиотечных таблиц в нижний регистр и сохраняет их на диске. Оператор SQL также преобразует имена библиотечных таблиц в нижний регистр. Если вам нужно запросить ранее созданную Test_table (чтобы сгенерировать файл Test_table.frm), даже если вы выполните select * from Test_table, он будет преобразован в select * from test_table, так что таблицы ошибок не существует.

2 -- без учета регистра (по умолчанию в OS X)Созданная библиотечная таблица сохраняется на диске как есть. Но оператор SQL преобразует имя таблицы библиотеки в нижний регистр.

On Windows the default value is 1. On macOS, the default value is 2. On Linux, a value of 2 is not supported; the server forces the value to 0 instead.

В Windows по умолчанию 1. В macOS значение по умолчанию — 2. Значение 2 не поддерживается в Linux, сервер применяет значение 0.

И официальный сайт также предлагает: если вы запускаете MySQL в системе, где каталог данных находится в файловой системе, нечувствительной к регистру (такой как Windows или macOS), тоlower_case_table_names не должен быть установлен в 0.

Я пытаюсь настроить его в своей среде Windows 10lower_case_table_namesКогда он равен 0, служба MySQL не может быть запущена, и при запуске службы сообщается об ошибке. Система Windows не чувствительна к регистру, см. следующий рисунок:

在这里插入图片描述

Примечание: если вы хотите изменитьlower_case_table_namesДля этого значения измените my.ini под Windows, измените файл конфигурации my.cnf под Linux, вам нужно перезапустить службу, вы можете найти информацию в Интернете для конкретных операций.

02 Примечания

Общие скрытые опасности, вызванные изменением lower_case_table_names: если вlower_case_table_names=0, создается библиотечная таблица с заглавными буквами, измените наlower_case_table_names=1, его не найдут.

первый наборlower_case_table_names=0

CREATE TABLE `Student` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

show tables;
+----------------+
| Tables_in_aflyun |
+----------------+
| Student           |
+----------------+

установить сноваlower_case_table_names=1, Выполните запрос, независимо от того, является ли имя таблицы прописным или строчным, он предложит, что таблица не существует.

mysql> select * from Student;
1146 - Table 'aflyun.Student' doesn't exist

mysql> select * from student;
1146 - Table 'aflyun.student' doesn't exist

Решение: Если вы хотите, чтобы по умолчаниюlower_case_tables_nameустановить от 0 до 1,Сначала вам нужно преобразовать имя существующей таблицы библиотеки в нижний регистр..

Для случая, когда в имени таблицы присутствуют только прописные буквы:
①,lower_case_tables_name=0когда, выполнитьrename tableнижний регистр.
②, установкаlower_case_tables_name=1, перезапустите, чтобы изменения вступили в силу.

Для случая, когда имя библиотеки имеет заглавные буквы:
①,lower_case_tables_name=0когда используешьmysqldumpЭкспортируйте и удалите старую базу данных.
②, установкаlower_case_tables_name=1, перезапустите, чтобы изменения вступили в силу.
③ Импортируйте данные в экземпляр, в это время имя библиотеки, содержащее прописные буквы, было преобразовано в строчные.

03 Резюме

Имея опыт хождения по яме, я глубже разбираюсь в упомянутом в начале протоколе Ali Mysql. Различные операционные системы приводят к непостоянной чувствительности к регистру. Когда мы разрабатываем, мы должны разрабатывать по принципу чувствительности к регистру, чтобы разрабатываемые программы были совместимы с разными операционными системами. Поэтому рекомендуется ставитьlower_case_table_namesЗначение установлено равным 0, что удобно для строгого контроля чувствительности кода к регистру во время разработки, а также для улучшения совместимости и строгости кода.

04 Ссылки

Чувствительность MySQL к регистру lower_case_table_names и lower_case_file_system


Спасибо за чтение, если вы найдете этот пост в блоге полезным, пожалуйста, поставьте лайк, чтобы его увидело больше людей! Желаю тебе счастливого дня!



Что бы вы ни делали, пока вы продолжаете это делать, вы увидите разницу! На дороге ни смиренный, ни заносчивый!

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

© Фейюнь, который с каждым днем ​​становится все лучше