Автоматически обрезать длину строки, представленной в MySQL - PullRequest
6 голосов
/ 06 июля 2010

Когда я отправляю поле формы в базу данных mySQL, есть ли способ настроить базу данных на автоматическое удаление любых данных, превышающих длину поля данных?

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

РЕДАКТИРОВАТЬ для ясности

вот мой оператор вставки

<cfquery datasource='#arguments.dsn#' name="addPatient">        
                INSERT INTO patients(patientFirstname
                                ,patientLastname
                                ,nhsNumber
                                ,patientDOB
                                ,patientTitle
                                ,address1
                                ,address2
                                ,address3
                                ,address4
                                ,postcode
                                ,patientPhone1
                                )
                VALUES (<cfqueryparam value="#arguments.patientFirstname#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.patientLastname#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.nhsNumber#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.patientDOB#" cfsqltype="CF_SQL_TIMESTAMP"/>
                        ,<cfqueryparam value="#arguments.patientTitle#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.address1#" cfsqltype="CF_SQL_VARCHAR"/>
                        ,<cfqueryparam value="#arguments.address2#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.address3#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.address4#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.postcode#" cfsqltype="CF_SQL_LONGVARCHAR"/>
                        ,<cfqueryparam value="#arguments.patientPhone1#" cfsqltype="CF_SQL_VARCHAR"/>
                        )
            </cfquery>

поле таблицы PatientPhone равно VARCHAR (20)

Если я не проверяю отправку программно и просто набираю значение формы длиной 30 символов, я выкидываю ошибку (когда я думал, что это просто сохранит первые 20 символов)

Data truncation: Data too long for column 'patientPhone1' at row 8

Когда я настраивал БД с помощью мастера, я помню, что выбрал innodb и транзакционную и традиционную эмуляцию (что было рекомендовано, если я правильно помню)

Ответы [ 4 ]

9 голосов
/ 06 июля 2010

Вы хотите сказать, что хотите установить это в сценарии определения данных, например, при создании таблицы? Согласно документации, вы не можете сделать это. Возможно, вы могли бы использовать триггер для обработки данных до их вставки? Примерно так (не могу гарантировать, что приведенный ниже код действительно работает):

CREATE TRIGGER chopdata BEFORE INSERT ON mytable
  FOR EACH ROW BEGIN
    NEW.myfield = SELECT SUBSTRING(NEW.myfield,1,20)
  END;

В противном случае вы можете нарезать максимальную длину, используя подстроку прямо в вашем запросе / процедуре:

SELECT SUBSTRING('your very long string goes here',1,20);
8 голосов
/ 06 июля 2010

MySQL по умолчанию делает это уже!На мой взгляд, этого не должно быть, но это так.

Если он выдает сообщения об ошибках, а не просто обрезает данные, возможно, включен традиционный режим.Запустите SELECT @@SESSION.sql_mode и посмотрите, что он говорит.Если он выплевывает

STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER

, то он находится в традиционном режиме;выдайте SET SESSION sql_mode='' при каждом подключении, или подключитесь с использованием учетной записи с привилегиями SUPER и введите SET GLOBAL sql_mode='modes'.

0 голосов
/ 06 июля 2010

Редактировать: это не должен быть принятый ответ.

Неверный ответ: MySQL будет обрезать любое значение вставки, которое превышает указанную ширину столбца.

На это поведение никогда не следует полагаться.

0 голосов
/ 06 июля 2010

Просто установите размер поля БД на максимальный размер, который вы хотите принять.
Если вы хотите максимум 20 символов, установите для него значение varchar (20) или char (20).
Просто будьте осторожныUTF8 вводит, некоторые из них символы занимают 2 места вместо одного.
Но, как вы можете прочитать в комментариях.Выбор кодировки utf8 решит эту проблему.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...