Тимчасовий обхід обмеження довжини varchar

В одному з моїх поточних проектів у процесі розробки процесу імпорту великих об’ємів даних виникла задача ефективно (швидко) обійти обмеження довжини varchar полів у базі даних. Фактично, ми готові були пожертвувати частиною даних задля збереження швидкості роботи.

Річ у тім, що MySQL за умовчанням не дозволяє запхати в поле varchar рядок довший за наперед визначену розмірність.

Але це можна обійти скинувши налаштування @@sql_mode.

В якості демонстрації принципу наведу шмат коду, коментарі мають все пояснити.

<!---
CREATE TABLE IF NOT EXISTS contacts (
  contactId int(10) unsigned NOT NULL AUTO_INCREMENT,
  salutation varchar(5) DEFAULT NULL,
  firstname varchar(255) DEFAULT NULL,
  PRIMARY KEY (contactId)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 --->


<cfset local = {} />
<cfset local.value = "Doctor" />


<!--- save the current SQL mode --->
<cfquery datasource="my_test_dsn" name="local.getSqlMode">
    select @@sql_mode as sqlmode
</cfquery>

<!--- reset the SQL mode --->
<cfquery datasource="my_test_dsn" result="local.resetSqlMode">
    set sql_mode = ''
</cfquery>


<!--- this should work fine --->
<cfquery datasource="my_test_dsn" result="local.pushContact">
    INSERT INTO contacts (salutation, firstname) VALUES ('#local.value#', '#local.value#')
</cfquery>


<!--- restore the SQL mode --->
<cfquery datasource="my_test_dsn" result="local.revertSqlMode">
    set sql_mode = '#local.getSqlMode.sqlmode#'
</cfquery>


<!--- this should fail --->
<cfquery datasource="my_test_dsn" result="local.pushContact">
    INSERT INTO contacts (salutation, firstname) VALUES ('#local.value#', '#local.value#')
</cfquery>


<cfdump var="#local#">

Автор: Сергій Галашин | Опубліковано: 14.09.2010 о 15:51 | Категорії: Gotchas - MySQL -

Відгуки